@hainingwyx
2020-10-17T15:40:24.000000Z
字数 773
阅读 832
rabbitmq
问题原因:
网络抖动
解决办法:
事务
在生产者发送消息之前,通过channel.txSelect开启一个事务,接着发送消息, 如果消息投递失败,进行事务回滚channel.txRollback,然后重新发送, 如果消息投递成功,就提交事务channel.txCommit。
缺点:同步操作。生产者吞吐量大大降低。
发布者确认
一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一deliveryTag和multiple参数),这就使得生产者知晓消息已经正确到达了目的地。
其他
问题原因:
解决办法:
1、消息持久化+队列持久化
消息设置delivery-mode为2,队列设置为durable
2、使用HA队列
发布者发送消息到集群中的任何节点。RabbitMQ节点同步队列中消息的状态。发布的消息被放入队列,并存储在每台服务器上。
3、集群设置>=1的磁盘节点。
磁盘节点保存集群的运行时状态。确保有多个磁盘节点,保证故障场景下的可靠性。集群恢复时,需要注意磁盘节点的启动顺序。
问题原因:错误代码
解决办法:
1、使用消费者手动确认消费
2、消费者程序使用事务提交和回滚批量操作。