当前位置: 首页 > news >正文

[RabbitMQ] RabbitMQ简单概述,用法和交换机模型

MQ概述:

Message Queue(消息队列),实在消息的传输过程中保存消息的容器,都用于分布式系统之间进行通信
分布式系统通信的两种方式:直接远程调用 和 借助第三昂 完成间接通信
发送方称谓生产者,接收方称为消费者

MQ优势和劣势

优势:

  1. 应用解耦:如 把一个系统的不同功能拆分出来,中间连接mq,那么其中一个功能的系统挂掉也不会影响其它系统,达到解耦
  2. 异步提速:如 一个订单接受下单请求,正常需要去库存,支付,物流三个系统走一遍,但是可以通过直接交手mq然后直接返回,那三个系统用mq去排队进行操作,大大缩短等待时间,增加系统吞吐量
  3. 削峰填谷

劣势:

  1. 系统可用性降低
  2. 系统复杂性提高
  3. 一致性问题

RabbitMQ时基于AMQP(高级信息队里额协议)用于软件通信的中间件

RabbitMQ四大核心

  1. 生产者
  2. 消费者
  3. 队列
  4. 交换机

AMQP协议是一种二进制协议,它定义了一组规则和标准,以确保消息可以在不同的应用程序和平台之间传递和解释,AMQP包含四个核心组件:

  1. 消息
  2. 交换机
  3. 队列
  4. 绑定

工作原理

Broker:接受和分发消息的应用。RabbitMQ Server 就是 Message Broker
Virtual host:是一个虚拟主机的概念,一个Broker可以有多个Virtual host,每个Virtual都有一套自己的Exchange(交换机)和Queue(队列)

RabbitMQ工作原理

快速上手

  1. 导入依赖
    <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.16.0</version></dependency>
  1. 写一个生产者
public class Producer {public static void main(String[] args) throws Exception {String queueName = "test_queue_name";String exchangeName = "test_exchange_name";//创建链接工厂ConnectionFactory factory = new ConnectionFactory();//服务地址factory.setHost("xx.xx.xx.xx");//账号密码factory.setUsername("root");factory.setPassword("xxx");//端口号factory.setPort(5672);//创建链接Connection connection = factory.newConnection();//创建信道Channel channel = connection.createChannel();/*** 创建交换机* params:* 1. 交换机名称* 2. 交换机类型:direct,topic,fanout,headers* 3. 指定交换机是否持久化 - true:那么交换机的元数据要持久化* 4. 指定交换机没有队列绑定时是否需要删除* 5. Map<String,Object>用来指定我们交换机其他的结构化参数,*/channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);/*** 生成一个队列* params* 1. 队列名称* 2. 队列是否需要持久化 - 是队列名称等这些元数据的持久化,不是队列中消息的持久化* 3. 标识队列是不是私有的,如果是私有的,只有创建它的应用程序才能消费消息* 4. 队列在没有消费者订阅的情况下是否自动删除* 5. 队列的一些结构化信息,比如声明私信队列,磁盘队列会用到*/channel.queueDeclare(queueName,true,false,false,null);/*** 将交换机和队列绑定* params:* 1.队列名称* 2. 交换机名称* 3. 路由键 - 在直连模式下,可以为我们队列名称*/channel.queueBind(queueName,exchangeName,queueName);/**发送消息* params:* 1. 发送到哪个交换机* 2. 队列名称* 3. 其他参数信息* 4. 发送消息的消息体*/String msg = "hello RabbitMQ!";channel.basicPublish(exchangeName,queueName,null,msg.getBytes());channel.close();connection.close();}
}
  1. 再写一个消费者来消费消息
public class Consumer {public static void main(String[] args) throws Exception{String queueName = "test_queue_name";String exchangeName = "test_exchange_name";//创建链接工厂ConnectionFactory factory = new ConnectionFactory();//服务地址factory.setHost("xx.xx.xx.xx");//账号密码factory.setUsername("root");factory.setPassword("xxx");//端口号factory.setPort(5672);//创建链接Connection connection = factory.newConnection();//创建信道Channel channel = connection.createChannel();//接收消息的回调函数DeliverCallback deliverCallback = (consumerTage, message) -> {System.out.println("接收到消息" + new String(message.getBody()));};//取消消息的回调函数CancelCallback cancelCallback = consumerTage -> {System.out.println("消费消息被中断");};/*** 消费消息* Params:* 1. 消费那个队列* 2. 消费成功后是否自动应答* 3. 接收消息的回调函数* 4. 取消消息的回调函数*/channel.basicConsume(queueName,true,deliverCallback,cancelCallback);}
}

RabbitMQ的交换机类型

  1. direct
    路由键与队列名完全匹配的交换机,通过RoutingKey路由键将交换机和队列进行绑定
public class Producer {public static void main(String[] args) throws Exception {String exchangeName = "test_exchange_name";String queueName1 = "test_queue_name1";String queueName2 = "test_queue_name2";String queueName3 = "test_queue_name3";String queueName4 = "test_queue_name4";String key1 = "key_1";String key3 = "key_3";String key4 = "key_4";ConnectionFactory factory = new ConnectionFactory();factory.setHost("xx.xxx.xxx.xx");factory.setUsername("root");factory.setPassword("xxx");factory.setPort(5672);Connection connection = factory.newConnection();       Channel channel = connection.createChannel();channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);channel.queueDeclare(queueName1,true,false,false,null);channel.queueDeclare(queueName2,true,false,false,null);channel.queueDeclare(queueName3,true,false,false,null);channel.queueDeclare(queueName4,true,false,false,null);channel.queueBind(queueName1,exchangeName,key1);channel.queueBind(queueName2,exchangeName,key1);channel.queueBind(queueName3,exchangeName,key3);channel.queueBind(queueName4,exchangeName,key4);channel.basicPublish(exchangeName,key1,null,"hello Key1".getBytes());channel.basicPublish(exchangeName,key3,null,"hello Key3".getBytes());channel.basicPublish(exchangeName,key4,null,"hello Key4".getBytes());channel.close();connection.close();System.out.println("发送消息成功");}
}

如上述代码,执行过后,四个队列每个都会收到消息,其中test_queue_name1,test_queue_name2各收到了一条hello Key1
direct的拼配要求是精准的,设置路由为key1就只能向key1发送才会接收到,发送key或者key.1之类都是不会接收到的
2. fanout

扇出类型交换机,会将消息分发给所有绑定了此交换机的队列,此时RoutingKey参数无效
也就是说,fanout类型交换机下发一条消息,无论RoutingKey是什么,所有队列都会收到消息

  1. topic
    主题类型交换机,此种交换机与Direct类似,也需要routingkey进行匹配分发,区别在于可以模糊查询
    Topic中,将routingkey通过"."来分为多个部分
    “*”:代表一个部分
    “#”:代表0-多个部分,路由键为#,则代表接受所有信息

  2. headers 性能太差 不做学习

相关文章:

[RabbitMQ] RabbitMQ简单概述,用法和交换机模型

MQ概述&#xff1a; Message Queue(消息队列)&#xff0c;实在消息的传输过程中保存消息的容器&#xff0c;都用于分布式系统之间进行通信 分布式系统通信的两种方式&#xff1a;直接远程调用 和 借助第三昂 完成间接通信 发送方称谓生产者&#xff0c;接收方称为消费者 MQ优…...

Oracle 多条记录根据某个字段获取相邻两条数据间的间隔天数,小于31天的记录都筛选出来

需求描述&#xff1a;在Oracle中 住院记录记录表为v_hospitalRecords&#xff0c;表中FIHDATE入院时间&#xff0c;FBIHID是住院号&#xff0c; 我想查询出每个患者在他们的所有住院记录中是否在一个月内再次入院(相邻的两条记录进行比较)&#xff0c;并且住院记录大于一的患者…...

【数据挖掘】如何修复时序分析缺少的日期

一、说明 我撰写本文的目的是通过引导您完成一个示例来帮助您了解 TVF 以及如何使用它们&#xff0c;该示例解决了时间序列分析中常见的缺失日期问题。 我们将介绍&#xff1a; 如何生成日期以填补数据中缺失的空白如何创建 TVF 和参数的使用如何呼叫 TVF我们将考虑扩展我们的日…...

CDN、P2P、PCDN的区别是什么

本篇文章为大家介绍一下与网络加速有关的几个重要概念&#xff0c;一起了解一下CDN,P2P和PCDN究竟是什么吧&#xff01; 1. CDN CDN即Content Delivery Network&#xff0c;中文全称为内容分发网络。 如果内容离用户远&#xff0c;用户可能无法获得及时的响应&#xff0c;那…...

MYSQL练习一答案

练习1答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、查询商品库存等于50的所有商品&#xff0c;显示商品编号&#xff0c;商 品名称&#xff0c;商品售价&#xff0c;商品库存。 SQL语句 select good_no,good…...

路由器(第二十五课)

路由器的深入学习 一、路由 1、路由 1) 什么是路由:路由就是数据包从一个网络到另外一外网络的过程 2)支持路由功能的设备:路由器、三层交换机、防火墙 3 路由器转发数据包的依据: -每一台路由器都维护着一张路由表 -路由器是依靠这张路由表来转发数据的 -这张路由表就…...

物联网网关模块可以带几台plc设备吗?可以接几个modbus设备?

随着物联网技术的快速发展&#xff0c;物联网网关模块已经成为了实现物联网应用的重要工具。很多客户在选择物联网网关模块时想了解物联网网关模块的设备接入能力&#xff0c;一个物联网网关模块可以带几台PLC设备&#xff1f;可以接几个Modbus设备&#xff1f; 物联网网关模块…...

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址&#xff08;已开源&#xff09;&#xff1a;https://gitee.com/sizhaohe/mini-mybatis.git 跟着源码及下述UML图来理解上手会更快&#xff0c;拒绝浮躁&#xff0c;沉下心来搞 定义&#x…...

结构化思维:高效能项目经理人的底层能力

大家好&#xff0c;我是老原。 我们经常会说「高效能」&#xff0c;那怎么成为高效能人士&#xff1f;其实除了拼体力和心力以外&#xff0c;高效能更重要的是脑力&#xff0c;这里的脑力不是指智力&#xff0c;而是结构化思维。 随着你在职场中不断成长和进阶&#xff0c;级…...

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…...

vue3+ts+elementui-plus二次封装树形表格

复制粘贴即可&#xff1a; 一、定义table组件 <template><div classmain><div><el-table ref"multipleTableRef" :height"height" :default-expand-all"isExpend" :data"treeTableData"style"width: 100%…...

机器学习/深度学习常见算法实现(秋招版)

包括BN层、卷积层、池化层、交叉熵、随机梯度下降法、非极大抑制、k均值聚类等秋招常见的代码实现。 1. BN层 import numpy as npdef batch_norm(outputs, gamma, beta, epsilon1e-6, momentum0.9, running_mean0, running_var1)::param outputs: [B, L]:param gamma: mean:p…...

京东技术专家首推:Spring 微服务架构设计,GitHub 星标 128K

前言 本书提供了实现大型响应式微服务的实用方法和指导原则&#xff0c;并通过示例全面 讲解如何构建微服务。本书深入介绍了 Spring Boot、Spring Cloud、 Docker、Mesos 和 Marathon&#xff0c;还会教授如何用 Spring Boot 部署自治服务&#xff0c;而 无须使用重量级应用服…...

R语言--森林图制作

#数据准备- data5 #install.packages("rmda")rm(list=ls())library(MASS)library(rmda)library(dplyr) #mutate依赖环境library(magrittr) #%>%依赖setwd("D:/R/nomo5new2")data...

Tomcat中利用war包部署

在Tomcat中利用war包部署Web应用程序时&#xff0c;默认情况下&#xff0c;应用程序的上下文路径&#xff08;也称为项目名称&#xff09;将是war文件的名称&#xff08;去除.war扩展名&#xff09;。这意味着您在访问Web应用程序时必须在URL中包含项目名称。例如&#xff0c;如…...

[JAVAee]线程安全

目录 线程安全的理解 线程不安全的原因 ①非原子性 ②可见性 ③代码重排序 体会何为不安全的线程 保证线程安全 一个代码在多线程的环境下就很容易出现错误. 线程安全的理解 线程安全是什么呢?通俗的来讲,线程安全就是在多线程的环境下,代码的结果是符合我们预期的,就…...

ELK环境搭建——概况

Elastic Stack,核心产品包括 Elasticsearch、Kibana、Beats 和 Logstash等等。能够安全可靠地从任何来源获取任何格式的数据,然后对数据进行搜索、分析和可视化。 目录 一:Elasticsearch: 1.1 从数据中探寻各种问题的答案 1.1.1 定义您自己的搜索方式...

面试知识点整理

计算机的物理内存是有限的&#xff0c;所以操作系统在遇到内存不足时&#xff0c;会通过换页机制暂时把 某个进程未使用的内存中的数据搬移到硬盘上&#xff08;比如 Linux 的 swap 分区&#xff09;&#xff0c;并在系统页表中 删除相应的表项。当该进程访问数据已经被搬移到硬…...

腾讯云服务器CVM计算型c6/c5实例CPU型号、处理器主频大全

腾讯云服务器CVM计算型C6、C5、C4、CN3、C3和C2实例&#xff0c;计算型C6云服务器CPU采用Intel Xeon Ice Lake处理器&#xff0c;主频3.2GHz&#xff0c;睿频3.5GHz&#xff0c;腾讯云服务器网分享更多计算型CVM云服务器CPU型号、处理器主频性能说明&#xff1a; 目录 云服务…...

vue3笔记-脚手架篇

第一章 基础篇 第二章 脚手架篇 vue2与vue3的一些区别 响应式系统&#xff1a; Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听&#xff0c;它对数据监听是一项项的进行监听&#xff0c;因此&#xff0c;当新增属性发生变化时&#xff0c;它无法监测到&…...

数字的补数

题目&#xff1a; 对整数的二进制表示取反&#xff08;0 变 1 &#xff0c;1 变 0&#xff09;后&#xff0c;再转换为十进制表示&#xff0c;可以得到这个整数的补数。 例如&#xff0c;整数 5 的二进制表示是 "101" &#xff0c;取反后得到 "010" &…...

Taskfile demo

https://github.com/yangyang5214/blog/issues/1 makefile 很好用&#xff0c;但是有些语法我不会。 go-task yml & shell 不错&#xff0c;推荐 Taskfile.yml https://github.com/go-task/task/blob/main/.golangci.yml # go install github.com/go-task/task/v3/cmd/ta…...

MyBatis学习笔记之高级映射及延迟加载

文章目录 环境搭建&#xff0c;数据配置多对一的映射的思路逻辑级联属性映射association分布查询 一对多的映射的思路逻辑collection分布 环境搭建&#xff0c;数据配置 t_class表 t_stu表 多对一的映射的思路逻辑 多对一&#xff1a;多个学生对应一个班级 多的一方是st…...

小程序如何删除/上架/下架商品

在小程序中&#xff0c;产品的删除、上架和下架是常见的操作&#xff0c;可以根据实际需求来管理商品的展示与销售。下面将介绍如何在小程序中删除上架下架商品的具体步骤。 进入商品管理页面&#xff0c; 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。…...

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…...

使用fastjson错误

说明&#xff1a;使用fastjson时&#xff0c;对象解析不成功&#xff0c;一直报错&#xff0c;但是json格式没有错&#xff1b; 错误信息&#xff1a;Method threw ‘com.alibaba.fastjson.JSONException’ exception. json数据是正确的 分析&#xff1a;注意看&#xff0c;fa…...

【GitOps系列】使用Kustomize和Helm定义应用配置

文章目录 使用 Kustomize 定义应用改造示例应用1.创建基准和多环境目录2.环境差异分析3.为 Base 目录创建通用 Manifest4.为开发环境目录创建差异 Manifest5.为预发布环境创建差异 Manifest6.为生产环境创建差异 Manifest 部署 Kustomize 应用部署到开发环境部署到生产环境 使用…...

Android kotlin高阶函数与Java lambda表达式介绍与实战

一、介绍 目前在Java JDK版本的不断升高&#xff0c;新的表达式已开始出现&#xff0c;但是在Android混淆开发中&#xff0c;kotlin的语言与Java的语言是紧密贴合的。所以Java lambda表达式在kotlin中以新的身份出现&#xff1a;高阶函数与lambda表达式特别类似。接下来我讲会先…...

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…...

7.26 Qt

用QT制作一个登陆界面 运行代码 login.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于输出 #include <QIcon> //图标类头文件 #include <QPushButton&…...