MQ如何保证消息不丢失
MQ如何保证消息不丢失
MQ如何保证消息不丢失
消息不可靠的情况可能是消息丢失,劫持等原因:
哪些环节可能会丢失消息?
生产者丢失消息消息列表丢失消息消费者丢失消息
怎么防止消息丢失
发送消息不丢失
- Kafka:
- 消息发送+回调
- RocketMQ:
- 消息发送+回调
- 事务消息机制
- RabbitMQ:
- 消息发送+回调
- 手动事务:这种方式对channel是会产生阻塞的,造成吞吐量下降
- channel.txSelect() 开启事务
- channel.txCommit() 提交事务
- channel.txRollBack() 回滚事务
- Publisher Confirm:整个处理流程跟RocketMQ的事务消息,基本是一样的。
事务消息机制
MQ主从消息同步不丢失
- RocketMQ:
- 普通集群中
- 同步同步:会阻塞,效率相对会低,但不会丢失消息
- 异步同步:效率高,但可能会丢消息
- Dledger集群:两阶段提交
- 普通集群中
- RabbitMQ:
- 普通集群:消息是分散存储的。节点之间不会主动进行消息同步,是有可能丢失消息的
- 镜像集群:会在节点之间进行数据同步,这样数据安全性得到了提高。
- Kafka:通常都是用在允许消息少量丢失的场景。acks:0、1、all
消息存盘不丢失
RocketMQ:同步刷盘:消息安全性更高,但是效率会降低异步刷盘:效率更高,但是消息可能会丢失
RabbitMQ:将队列配置成持久化队列。新增的Quorum类型队列,会采用Raft协议来进行消息同步。
消费者消费消息不丢失
RocketMQ:在消费端使用默认的方式(同步消费,先提交本地事务,在响应MQ改变偏移量)消费,不要采用异步房补。RabbitMQ:autoCommit -> 手动提交offsetKafka:手动提交offset
本文由作者按照 CC BY 4.0 进行授权
