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.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...
随机推荐
- Eclipse Git分支实战
切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...
- Oracle锁表信息处理步骤
查看是否有锁表的sql select 'blocker(' || lb.sid || ':' || sb.username || ')-sql:' || qb.sql_text blockers, ' ...
- linux 性能分析常用命令汇总
CPU性能分析工具: vmstatpssartimestracepstreetop Memory(内存)性能分析工具:vmstatstracetopipcsipcrmcat /proc/meminfo ...
- maven 坐标获取方式
问题:我们在开发时pom.xml文件中的 <dependencies> <dependency> <groupId>org.mybatis& ...
- MySQL--limit使用注意
limit m,n 的意义是在选择.查询得到的结果中,从第m条开始,拿连续的n条作为结果返回.根据它的原理可以知道,select ....limit m,n时要扫描得到的数据条数是m+n条.这就导致m ...
- 【leetcode】1161. Maximum Level Sum of a Binary Tree
题目如下: Given the root of a binary tree, the level of its root is 1, the level of its children is 2, a ...
- 华为云服务器centos7.3 安装jdk
1. 进入oracle官网 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 服 ...
- bullet学习日记
最近需要bullet用物理引擎做一个测量类的项目,因为半途接手,物理部分其实已经实现,但犹于对bullet基本不了解,导致相关部分完全改不动,这两天静下心来把物理引擎用法了解了一翻,顺便做点笔记,以便 ...
- docker 内时区和宿主机差8个小时,怎么办?
docker run -d -it --name tt -e TZ=Asia/Shanghai -p : api 使用-e参数指定时区
- luogu P1125 笨小猴 x
P1125 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设max ...