Mq是如何实现可靠性投递的?

一 mq的通用消息投递过程

如下图:

![image](images/4a0fwDjYezdJr-_yCxakDan89W5Lj8FwvCF_6iX6PK0.png)

  1. 生产者发送消息
  2. 服务器采取不同的策略持久化
  3. ack缺人,告知生产者我已经收到
  4. 消费者消费消息
  5. ack回复服务器我已经收到
  6. 服务器删除消息

mq本身处理的逻辑:

  1. 发送阶段,遇到高延迟,Producer会多次重发消息(根据重试设置),直到Broker ack确认,过程中Broker会自动去重,超时Producer产生异常,应用进行捕获提示。
  2. 存储阶段,(根据刷盘机制设置)Broker先刷盘再ack确认,即便ack失败消息不会丢失,多次重试直到Producer接收,会导致消息积压。
  3. 消费阶段,Broker向Consumer发数据,一段时间未接收,根据设置的策略自动重发,直到Consumer Ack确认,Consumer注意幂等处理。

一些可根据实际业务调整的方案:

  1. 异步刷盘(NSYNC_FLUSH),改同步刷盘
  2. 存储介质损坏,建议采用RAID10或分布式存储
  3. 不要启用自动Ack,RabbitMQ存在此问题
  4. 避开都市传说ActiveMQ

什么是raid10:

![image](images/UOctgcdxPB0WDagU32WuCnJ5NZtywAvh1Z3b9xi6MUs.jpeg)

raid1:两块数据完全一样的磁盘

raid0:两块数据分散的磁盘

Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate