0


RabbitMQ:如何确保消息不丢失?

一,生产者方面

1,生产者开启mq事务(channel.txSelect)。如果发送不成功则会报错,此时可以通过事务来回滚(channel.txRollback),成功收到消息则事务提交(channel.txCommit)。因为
生产者事务是同步的机制,当事务提交后会阻塞在那儿,当吞吐量上来后这种方式会影响性能。
2,开启生产者确认机制。使用confirm机制,confirm是异步形式。生产者发送消息时会给消息添加一个ia,当生产者成功发送消息到mq时,mq会返回一个ack给生产者,生产者收到ack说明
消息发送成功,可以做后续处理。如果mq没能处理生产者发送的消息则会回掉nack方法,生产者可以在这个方法里面重新发送消息。如果超过一定时间还没有接收到回调消息则生产者可以自行重
发消息。

二,MQ方面

1,mq持久化消息。mq消息默认是存放在内存上面的,要保证消息不丢失则需要持久化到磁盘上,这样即使mq宕机了重启后也可以从磁盘上读取到持久化的消息。那么要做到消息持久化,必须满足
一下三个条件:
1)Exchange持久化。
2)Queue持久化。
3)消息持久化发送,设置deliveryMode=2,代表持久化发送。
2,mq采用HAPROXY集群镜像部署模式。说一下三种模式:
1)单节点模式。非集群部署,当节点挂掉了,可能导致业务瘫痪,只能等待服务器恢复。
2)普通模式。消息只存在于当前节点中,不会同步到其他节点。当前节点挂掉了,有影响的业务会导致瘫痪,需等待当前节点恢复。
3)镜像模式。将消息同步到其他节点上,当当前节点挂掉了,其他节点可以继续提供服务,可以设置同步节点个数。但是吞吐量会下降,属于RabbitMq的HA方案。
三种HA策略模式:(镜像集群模式唯一的缺点就是系统吞吐量会下降。)
(1)同步至所有节点。
(2)同步最多N个机器。
(3)同步至符合指定名称的节点。
3,消息补偿机制。
1)业务数据和消息数据在生产端直接入库,如果消息数据入库失败,则整体进行回滚操作。
2)根据表中消息状态,进行相对应的补偿措施。

三,消费者方面

1,关闭自动ack,消费者开启手动确认消息(channel.basicAck)。每次消息处理完消费者在代码里手动调用ack,这样可以避免消息还没处理完就ack,从而保证
消息不丢失。
消费者自动ack会将消息提交到线程池中处理,此时如果消费者服务器出问题,则会导致消息处理失败,从而导致消息丢失。


本文转载自: https://blog.csdn.net/qq_44813449/article/details/141720199
版权归原作者 追逐影子 所有, 如有侵权,请联系我们删除。

“RabbitMQ:如何确保消息不丢失?”的评论:

还没有评论