RabbitMQ 是 AMQP 协议的一个开源实现


(1)生产者Publisher:生产消息,就是投递消息的一方
(2)消费者Consumer:消费消息,也就是接收消息的一方
(3)Broker服务节点:表示消息队列服务器
(4)Queue:消息队列,用来存放消息
(5)Exchange:交换器,接受生产者发送的消息,根据路由键将消息路由到绑定的队列上
(6)Routing Key: 路由关键字,用于指定这个消息的路由规则
(7)Binding:绑定,通过绑定将交换器和队列关联起来,一般会指定一个BindingKey
(8)Connection :TCP网络连接
(9)Channel: 信道,AMQP 命令都是在信道中进行的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接,一个TCP连接可以用多个信道。客户端可以建立多个channel,每个channel表示一个会话任务。
(10)Message:消息,由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
(11)Virtual host:虚拟主机,用于逻辑隔离,表示一批独立的交换器、消息队列和相关对象。一个Virtual host可以有若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段
fanout:把所有发送到fanout交换器的消息路由到所有绑定该交换器的队列中,fanout 类型转发消息是最快的。
direct:消息中的路由键(RoutingKey)如果和 Bingding 中的 bindingKey 完全匹配,交换器就将消息发到对应的队列中。是基于完全匹配。
topic:通过模式匹配的方式对消息进行路由,支持多个RoutinKey单词,支持通配符匹配
通配符规则:
#:匹配一个或多个词
*:匹配不多不少恰好1个词
BindingKey 可以使用通配符,用于绑定交换机和队列
RoutingKey 具体匹配,如:发送消息需要指定具体key
(1)Producer 先连接到 Broker,建立TCP连接 Connection,开启一个信道 channel
(2)Producer 声明交换器和队列并通过BindingKey绑定在一起,fanout忽略bingingKey
(3)Producer 发送消息到 Broker,其中包含路由键、交换器等信息
(4)交换器根据接收到的路由键查找匹配的队列
(5)如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者
(6)关闭信道
(1)Producer 先连接到 Broker,建立TCP连接 Connection,开启一个信道 channel
(2)向 Broker 请求消费相应队列中消息,可能会设置响应的回调函数。
(3)等待 Broker 回应并投递相应队列中的消息,接收消息。
(4)消费者确认收到的消息,ack。
(5)RabbitMQ从队列中删除已经确定的消息。
(6)关闭信道
优点:解耦、异步、削峰
缺点:系统可用性降低、系统复杂度提高、一致性问题
RabbitMQ搭建模式有:
镜像集群模式高可用:
创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上
消息可靠性传输分析由三部分组成:生产者丢数据、消息队列丢数据、消费者丢数据
1.生产者丢数据:
RabbitMQ提供事务机制(transaction)和确认机制(confirm)两种模式来确保生产者不丢消息。
2.消息队列丢数据:
处理消息队列丢数据的情况,一般是开启持久化磁盘。持久化配置可以和生产者的 confirm 机制配合使用,在消息持久化磁盘后,再给生产者发送一个Ack信号。这样的话,如果消息持久化磁盘之前,即使 RabbitMQ 挂掉了,生产者也会因为收不到Ack信号而再次重发消息。
3.消费者丢数据
解决方案就是采用手动确认消息,设置 autoAck = False,等到消息被真正消费之后,再手动发送一个确认信号,即使中途消息没处理完,但是服务器宕机了,那 RabbitMQ 就收不到发的ack,然后 RabbitMQ 就会将这条消息重新分配给其他的消费者去处理。
开启生产者确认机制
开启持久化功能
开启消费者手动确认机制
开启消费者失败重试机制,多次重试失败后将消息投递到异常交换机,交由人工处理
重复消费问题的解决思路是:保证消息的唯一性,即使多次传输,也不让消息的多次消费带来影响,也就是保证消息等幂性;幂等性指一个操作执行任意多次所产生的影响均与一次执行的影响相同。

优点:

缺点:

