Spring Boot 之 RabbitMQ 消息队列中间件的三种模式
开门见山(文末附有消息队列的几个基本概念)
1、直接模式( Direct)模式
直白的说就是一对一,生产者对应唯一的消费者(当然同一个消费者可以开启多个服务)。
虽然使用了自带的交换器(Exchange),但使用的是默认的“”空字符串交换器,
也相当于直接跨过交换器到达消息队列,也是称为直接模式的原因(猜的)
生产者代码:
@Autowired
private RabbitTemplate rabbitTemplate; /*
普通模式:
*/
@Test
public void SendMag(){
rabbitTemplate.convertAndSend("Not_Copy1","直接模式测试");
}
RabbitMQ管理器:

消费者代码:
服务一
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("11111Not_Copy1:"+msg);
}
}
服务二
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("22222Not_Copy1:"+msg);
}
}
服务三
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("33333Not_Copy1:"+msg);
}
}
消息连发三次
结果:
服务一:11111Not_Copy1:直接模式测试
服务二:22222Not_Copy1:直接模式测试
服务三:33333Not_Copy1:直接模式测试
证明存在着默认的负载均衡。
2、分裂模式(Fanout)模式
直白的说就是一对多,一个生产者对应多个消费者(当然同一个消费者可以开启多个服务)。
使用了自定义的交换器(Exchange),由交换器分发给与当前交换器相 关联的消息队列,
就像发牌员发牌一样。
生产者代码:
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 分裂模式 交换器 Distributor
*/
@Test
public void SendMag1(){
rabbitTemplate.convertAndSend("Distributor","","分裂模式测试");
}
RabbitMQ管理器:
交换器 Distributor 分配了三个消息队列,因为是分裂模式是以Type选 fanout


消费者代码:
消费者一
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy1:"+msg);
}
}
消费者二
@Component
@RabbitListener(queues = "Not_Copy2")
public class Customer2 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy2:"+msg);
}
}
消费者三
@Component
@RabbitListener(queues = "Not_Copy3")
public class Customer3 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy3:"+msg);
}
}
消息发送一遍
结果:
消费者一:Not_Copy1:分裂模式测试
消费者二:Not_Copy2:分裂模式测试
消费者三:Not_Copy3:分裂模式测试
注意:每个消费者是一个类(Customer1,Customer2,Customer3),而不是三个消费者写在一个个类中。
3、主题模式(Topic)
直白的说主题模式也是一对多,只不过在分裂模式模式的基础上添加了规则或者说主题,
交换器按照规则或者说按照主题下发,符合规则或者说主题的才下发
生产者代码:
@Autowired
private RabbitTemplate rabbitTemplate;/*
主题模式
*/
@Test
public void SendMag1(){
rabbitTemplate.convertAndSend("Distributor2","good.abc","主题模式测试");
}
@Test
public void SendMag2(){
rabbitTemplate.convertAndSend("Distributor2","good.abc.log","主题模式测试");
}
@Test
public void SendMag3(){
rabbitTemplate.convertAndSend("Distributor2","good.log","主题模式测试");
}
RabbitMQ管理器:
交换器Distributor2 分配了三个消息队列,并为各其配置了主题 因为是分裂模式是以Type选 topic


结果:
生产者:SendMag1(),主题:good.abc ,
对应消费者:Not_Copy1:主题模式测试
生产者: SendMag2() ,主题:good.abc.log ,
对应消费者:Not_Copy1:主题模式测试
Not_Copy2:主题模式测试
生产者: SendMag3() ,主题:good.log ,
对应消费者:Not_Copy1:主题模式测试
Not_Copy2:主题模式测试
Not_Copy3:主题模式测试
通过这三个主题大家应该已经熟悉了主题模式的应用。
基本概念:
RabbitMQ Server: 也叫broker server,它是一种传输服务。 他的角色就是维护一条 从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。
Producer: 消息生产者,如图A、B、C,数据的发送方。消息生产者连接RabbitMQ服 务器然后将消息投递到Exchange。
Consumer:消息消费者,如图1、2、3,数据的接收方。消息消费者订阅队列, RabbitMQ将Queue中的消息发送到消息消费者。
Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个 或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ中的Exchange有 direct、fanout、topic、headers四种类型,每种类型对应不同的路由规则。
Queue:(队列)是RabbitMQ的内部对象,用于存储消息。消息消费者就是通过订阅 队列来获取消息的,RabbitMQ中的消息都只能存储在Queue中,生产者生产消息并终 投递到Queue中,消费者可以从Queue中获取消息并消费。多个消费者可以订阅同一个 Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者 都收到所有的消息并处理。
RoutingKey:生产者在将消息发送给Exchange的时候,一般会指定一个routing key, 来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联 合使用才能终生效。在Exchange Type与binding key固定的情况下(在正常使用时一 般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过 指定routing key来决定消息流向哪里。RabbitMQ为routing key设定的长度限制为255 bytes。
Connection: (连接):Producer和Consumer都是通过TCP连接到RabbitMQ Server 的。以后我们可以看到,程序的起始处就是建立这个TCP连接。
Channels: (信道):它建立在上述的TCP连接中。数据流动都是在Channel中进行 的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。
VirtualHost:权限控制的基本单位,一个VirtualHost里面有若干Exchange和 MessageQueue,以及指定被哪些user使用
Spring Boot 之 RabbitMQ 消息队列中间件的三种模式的更多相关文章
- Spring Boot (25) RabbitMQ消息队列
MQ全程(Message Queue)又名消息队列,是一种异步通讯的中间件.可以理解为邮局,发送者将消息投递到邮局,然后邮局帮我们发送给具体的接收者,具体发送过程和时间与我们无关,常见的MQ又kafk ...
- Spring Boot (26) RabbitMQ延迟队列
延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 订单业务: 在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单. 短 ...
- 在 CentOS7 上安装 RabbitMQ 消息队列中间件
RabbitMQ 是流行的开源消息队列系统,是 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的标准实现,用 erlang 语言开发.RabbitMQ ...
- 消息队列中间件(三)Kafka 入门指南
Kafka 来源 Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级 ...
- spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)
一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...
- Spring boot 使用Redis 消息队列
package com.loan.msg.config; import com.loan.msg.service.MessageReceiver; import org.springframework ...
- 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列
前言 前面学习了 RabbitMQ 基础,现在主要记录下学习 Spring Boot 整合 RabbitMQ ,调用它的 API ,以及中间使用的相关功能的记录. 相关的可以去我的博客/RabbitM ...
- ActiveMQ RabbitMQ RokcetMQ Kafka实战 消息队列中间件视频教程
附上消息队列中间件百度网盘连接: 链接: https://pan.baidu.com/s/1FFZQ5w17e1TlLDSF7yhzmA 密码: hr63
- Spring Boot 整合 rabbitmq
一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...
随机推荐
- Java全排列递归算法
Java全排列算法: 第一遍循环:将list数组index==0的元素依次与数组的每个元素交换,从而保证index==0的位置先后出现n个不同元素之一,实现对index==0位置的遍历. 第 i 遍循 ...
- 前端之CSS:属性操作1
css之操作属性 1.文本 1.文本颜色:color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 - 如: RGB(255,0, ...
- 如何提高SMTP邮件的安全性?从而不被黑客窃听
简单邮件传输协议(SMTP)用于在邮件服务器之间进行邮件传输,并且传统上是不安全的,因此容易被黑客窃听.命名实体的基于DNS的认证(国家统计局)用于SMTP提供了邮件传输更安全的方法,并逐渐变得越来越 ...
- git-bash.exe参数
baidu搜了很多, 没有结果.估计大家都没有这个场景.google了一下, 几篇非常不错的结果: https://superuser.com/questions/1104567/how-can-i- ...
- 【leetcode】491. Increasing Subsequences
题目如下: 解题思路:这题把我折腾了很久,一直没找到很合适的方法,主要是因为有重复的数字导致结果会有重复.最后尝试用字典记录满足条件的序列,保证不重复,居然Accept了. 代码如下: class S ...
- Rosetta Stone 不在C盘安装步骤
本文出自:http://www.cnblogs.com/2186009311CFF/p/7500637.html Rosetta Stone默认安装在C盘的,很不好,故找到次解决方案: 总体就是移动文 ...
- 进阶:python3实现 插入排序
一图胜千言,插入排序的核心逻辑如下: 将数据分成两半,前一半是已排好序的,后一半是待排序的 每次取后一半中的第一个数,在已排序的一半中,逆序依次比较,找到要插入的位置 记录插入的位置,在最后判断是否需 ...
- ZeroMQ的进阶
上一篇博文我们对ZeroMQ的经典模式做了写Demo让他跑起来了,但实际开发中我们可能面临一些远比上述复杂的场景.这时候我们需要进一步的对经典模式进行扩展,所幸ZeroMQ已经为我们做好了准备工作. ...
- layer.confirm
layer.confirm('确定不选择花车?', { title: false, btn: ['确定','取消'] //按钮 }, function(ind){ layer.close(ind); ...
- 【JOI2017春季合宿】Port Facility
http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...