文章

MQ如何保证消息不丢失

MQ如何保证消息不丢失

MQ如何保证消息不丢失

消息不可靠的情况可能是消息丢失,劫持等原因:

哪些环节可能会丢失消息?

生产者丢失消息消息列表丢失消息消费者丢失消息

怎么防止消息丢失

发送消息不丢失

  • Kafka:
    • 消息发送+回调
  • RocketMQ:
    • 消息发送+回调
    • 事务消息机制
  • RabbitMQ:
    • 消息发送+回调
    • 手动事务:这种方式对channel是会产生阻塞的,造成吞吐量下降
      • channel.txSelect() 开启事务
      • channel.txCommit() 提交事务
      • channel.txRollBack() 回滚事务
    • Publisher Confirm:整个处理流程跟RocketMQ的事务消息,基本是一样的。

事务消息机制

MQ主从消息同步不丢失

  1. RocketMQ:
    1. 普通集群中
      1. 同步同步:会阻塞,效率相对会低,但不会丢失消息
      2. 异步同步:效率高,但可能会丢消息
    2. Dledger集群:两阶段提交
  2. RabbitMQ:
    1. 普通集群:消息是分散存储的。节点之间不会主动进行消息同步,是有可能丢失消息的
    2. 镜像集群:会在节点之间进行数据同步,这样数据安全性得到了提高。
  3. Kafka:通常都是用在允许消息少量丢失的场景。acks:0、1、all

消息存盘不丢失

RocketMQ:同步刷盘:消息安全性更高,但是效率会降低异步刷盘:效率更高,但是消息可能会丢失

RabbitMQ:将队列配置成持久化队列。新增的Quorum类型队列,会采用Raft协议来进行消息同步。

消费者消费消息不丢失

RocketMQ:在消费端使用默认的方式(同步消费,先提交本地事务,在响应MQ改变偏移量)消费,不要采用异步房补。RabbitMQ:autoCommit -> 手动提交offsetKafka:手动提交offset

本文由作者按照 CC BY 4.0 进行授权