RabbitMQ学习笔记4:消息模式
Posted Vincent9847
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ学习笔记4:消息模式相关的知识,希望对你有一定的参考价值。
RabbitMQ有以下几种工作模式 :
- Simple ---简单模式:一个生产者,一个消费者;
- Work queues ---工作模式:一个生产者,多个消费者,每个消费者获取到的消息唯一(消费者彼此竞争成为接收者);
- Publish/Subscribe ---订阅模式:一个生产者发送的消息会被多个消费者获取。
- Routing ---路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key;
- Topics ---主题模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
- Header
- RPC
一、Simple 简单模式(一个生产者,一个消费者)
- 这种模式下不需要将Exchange进行任何绑定(binding)操作
一个生产者、一个队列、一个消费者的模式。消费者会采取autoAck自动确认方式,也就是说无论生产者发布多少消息到消息队列,消费者都会瞬间把这些消息从队列中读取出来放到java代码缓存中(这种模式就不用设置队列和消息持久化,因为队列很快就被消费者清空咯了),然后再慢慢的执行自己的业务代码。这样就会出现如果消费者服务突然宕机,这些在代码缓存的消息就会永久丢失,所以这种适合生产者发布消息量不大的,消费者能及时处理消息,而且消息数据不是很重要,就算消息丢失影响不大的的情况。
1.生产者
- 创建连接
- 创建通道
- 声明队列
- 发送消息
2.消费者
- 创建连接
- 创建通道
- 声明队列
- 监听队列
- 接收消息
- ack回复
二、Work queues(一个生产者,一个队列,多个消费者,每个消费者获取到的消息唯一)
- 工作队列模式,采用默认的交换机,路由名称为队列名称,有多个终端消费同一个队列的时候,交换机采用轮询发送消息,通俗点说就是给第一个发一条,另外一个发下一条
应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
测试:
1、使用入门程序,启动多个消费者。
2、生产者发送多个消息。
结果:
1、一条消息只会被一个消费者接收;
2、rabbit采用轮询的方式将消息是平均发送给消费者的;
3、消费者在处理完某条消息后,才会收到下一条消息。
三、 Publish/subscribe【fanout模式】(一个生产者,多个队列,多个消费者)
- 这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
1.发布订阅模式:
- 每个消费者监听自己的队列。
- 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息
2.生产者
- 声明Exchange_fanout_inform交换机。
- 声明两个队列并且绑定到此交换机,绑定时不需要指定routingkey
- 发送消息时不需要指定routingkey
3.消费者
交换机会将信息发布给每个监听本交换机的队列,但是如果多个消费者监听了同一个队列,这个队列还是会按照轮询方式把信息发给每个消费者,一人一条(非同一个信息)
4.publish/subscribe与work queues有什么区别:
- work queues不用定义交换机,而publish/subscribe需要定义交换机;
- publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机);
- publish/subscribe需要设置队列和交换机的绑定,work queues不需要设置,实质上work queues会将队列绑定到默认的交换机 。
5.相同点:
所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。
6.实质工作用什么 publish/subscribe还是work queues。
建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己专用的交换机。
四、Routing【direct】路由模式
1.路由模式:
- 每个消费者监听自己的队列,并且设置routingkey。
- 生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。
2.生产者
- 声明exchange_routing_inform交换机。
- 声明两个队列并且绑定到此交换机,绑定时需要指定routingkey
- 发送消息时需要指定routingkey
3.消费者
消费者绑定队列的时候可以指定routingkey来获取指定routingkey的消息
4.Routing模式和Publish/subscibe有啥区别?
Routing模式要求队列在绑定交换机时要指定routingkey,消息会转发到符合routingkey的队列。
五、Topic
两个通配符:
- 符号 # 匹配 0 个、一个或多个;
- 符号 * 只匹配一个;
1.路由模式:
- 每个消费者监听自己的队列,并且设置带统配符的routingkey。
- 生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列。
2.生产者
- 声明交换机,指定topic类型:
3.消费者
- 队列绑定交换机指定通配符:
- 统配符规则:中间以“.”分隔。
4.Topic模式更多加强大,它可以实现Routing、publish/subscirbe模式的功能。
六、 Header模式
header模式与routing不同的地方在于,header模式取消routingkey,使用header中的 key/value(键值对)匹配队列。
七、RPC
RPC即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:
1、客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
2、服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
3、服务端将RPC方法 的结果发送到RPC响应队列
4、客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。
以上是关于RabbitMQ学习笔记4:消息模式的主要内容,如果未能解决你的问题,请参考以下文章
RabbitMQ学习笔记3:RabbitMQ快速入门消息模式