RabbitMQ实战指南-RabbitMQ简介
1、什么是消息中间件?
消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串、JSON等,也可以很复杂,比如内嵌对象。
消息队列中间件(Message Queue Middleware,简称MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流。并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
它一般有两种传递模式:
- 点对点模式
- 发布订阅模式
2、消息中间件的作用
- 解耦
- 冗余 (存储):有些情况下,处理数据的过程会失败。消息中间件可以把数据进行持久化知道它们被处理完成,通过这一方式规避了数据丢失。在把一个消息从消息中间件中删除前,需要你的处理系统明确的指出该消息已经被处理完成了。
- 扩展性 :因为消息中间件解耦了应用的处理过程,所以提高消息入队和处理的效率是很容易的,只要另外增加处理过程就可以了,不需要改变代码,也不需要调节参数
- 削峰 : 在访问量剧增的情况下,使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃
- 可恢复性
- 顺序保证
- 缓冲
- 异步通信 :在很多情况下一些应用不需要立即处理消息。消息中间件可以提供异步处理机制
3、相关概念
- Exchange : 交换器,负责接收生成者的消息并路由到一个或多个消息队列中,它有四种类型:
- direct :RoutingKey 和 BindingKey 完全匹配
- fanout :将消息路由到所有与交换机绑定的队列中
- topic : RoutingKey 和 BindingKey 都是 " . "分割的字符串,BindingKey中允许两个特殊字符 ” # “ 和 ” * “ 来模糊匹配,# 可匹配多个单词,* 只能匹配一个单词
- Binding : 绑定,RabbitMQ中通过绑定将交换器和队列关联起来,在绑定的时候会指定一个BindingKey,这样RabbitMQ就知道如何正确的将消息路由到队列了。
- pupRoutingKey :路由键,用来指定这个消息的路由规则
4、Mandatory参数
- mandatory == true :无法匹配到消息队列,那么消息返回生产者,可以通过调用channel.addReturnListener来添加ReturnListener监听器来获取消息
- mandatory == false :无法匹配到消息队列,消息直接丢失
5、immediate参数
- immediate == true :当交换机在将消息路由到队列时,如果发现这个队列没有消费者就不会保存消息到这个队列。当与路由键匹配的所有队列都没有消费者,就将消息返回给生成者。
- 版本3.0去掉了该参数的支持
6、备份交换机(Alternate Exchange)
消息未被路由的情况下,不想消息丢失可以采取备份交换机
- 在声明交换器(调用channel.exchangeDeclare)时添加参数alternate-exchange来实现
- 或者通过策略方式实现,上面方式优先级更高