如何保证消息的可靠性

  • 生产者发送阶段:开启发送确认,失败了需要重试;核心业务可以落本地消息表或者事务消息,避免本地事务成功但是消息没有发送出去。
  • broker存储阶段:消息要持久化,关键的topic/队列配置副本高可用队列,刷盘策略和副本确认策略要和业务可靠性要求匹配。
  • 消费者处理阶段:业务处理成功后再ACK或提交offset;处理失败要重试、斤死信队列或进入补偿流程。
  • 业务兜底阶段:通过对账任务、补偿任务、警告和人工处理兜住极端异常。

不同的MQ的实现细节不同,但思路都一样:确认、持久化、重试、幂等、补偿。

如何处理重复消费幂等

生产环境通常很难保证消息绝对只被消费一次,因此必须做幂等操作。
幂等方案:

  • 业务唯一索引
  • 状态机
  • 消费记录表
  • redis去重