RabbitMQ消息可靠性、延迟队列以及高可用集群

介绍RabbitMQ的作用、不可靠性、如何保证可靠性、死信队列、集群。

1、作用:

①②RabbitMQ Server作为消息的接收者、消息的发送者;③消息持久化;④消息堆积延后传递;⑤消息广播;⑥消息分类路由

2、生产端和消费端都会存在不可靠的问题。

1)消费端不可靠:

消息的传递的过程:RabbitMQ Server-->OS buffer --> network -->RabbitMQ Client OS buffer --> RabbitMQ Client,因此造成不可靠的原因有三,网络故障、宕机、线程被kill。下图为消息消费过程。

RabbitMQ消息可靠性、延迟队列以及高可用集群

2)生产端不可靠:

上面消费端存在不可靠的问题,生产端也同样存在,因为消息也是经过publish client->本机OS->network->sever OS ->server的,流程与上图类似。而且,生产端还存在持久化失败的问题,生产端消息存在刷盘失败的情况,类似Redis的AOF,只能批量刷盘,否则性能太差。下图为消息保存过程。
RabbitMQ消息可靠性、延迟队列以及高可用集群

3、如何可靠

1)消费端如何可靠:

客户端消费(收到消息处理后)之后回复ACK,服务端再删除消息,未收到ACK会重新投递,ACK丢失会导致重复消费的情况,业务系统需做消息的去重处理(去重的思路可以是插库加主键约束,可以是利用消息的uuid借助set去重)。
两种ACK方式:
①autoACK投后即删(no ACK),不可靠,会出现消息过分堆积导致连接关闭问题
②Manual ACK,根据客户端的接纳能力,发送有限个消息,ACK一个,发送一个。

2)生产端如何可靠:

①批量publish,然后可以每次批量生产之后fsync刷盘

②其他的方法缺点明显,实现困难,暂不深研。

4、死信队列(设置了ttl的队列)——主要作用:延时

1)原理:给队列设置ttl即变成死信队列,消息有路由器转发至死信队列,当过期时,消息通过路由器被转发至其他的非死队列,即可实现正常消费。缺点:过期时间设置死板,一个队列一个过期时间,不同的过期时间需要不同的死信队列。如下图所示。

RabbitMQ消息可靠性、延迟队列以及高可用集群

2)作用:除了延时之外,被消费者拒绝的消息,也可以进入死信队列,过期时重新进入正常队列,然后被消费者消费。(Retry Later机制)

5、集群:

1)结构:如下图所示,元信息(如队列信息)每个节点(A B C)都有,队列中的消息只存在一个节点(B)上,客户端连接某个节点(C),在集群内部通过转发,通过C向B转发,实现消息互通。

RabbitMQ消息可靠性、延迟队列以及高可用集群

2)镜像队列——保证高可用性

RabbitMQ消息可靠性、延迟队列以及高可用集群

参考文献:

https://mp.weixin.qq.com/s/s7Bl2LMsGKqh6VXx-wci7A