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

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

1、作用:

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

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

1)消费端不可靠:

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

2)生产端不可靠:

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

3、如何可靠

1)消费端如何可靠:

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

2)生产端如何可靠:

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

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

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

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

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

5、集群:

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

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

参考文献:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值