消息可靠性投递的技术方案

  使用 MQ 技术最常见的核心需求,需要保证消息不丢失,100%投递成功。以下是一个可靠性投递的流程图,以说明可靠性投递的概念。

可靠性投递的流程图

step 1: 首先把消息信息(业务数据)存储到数据库中,紧接着,我们再把这个消息记录也存储到一张消息记录表里(者另外一个同源数据库的消息记录表)
step 2: 发送消息到MQ Broker节点(采用 confirm 方式发送,会有异步的返回结果)
step 3: 生产者端接受MQ Broker节点返回的 confirm 确认消息结果
step 4: 进行更新消息记录表里的消息状态。比如默认 status = 0 当收到消息确认成功后,更新为1即可
step 5: 但是在消息确认这个过程中可能由于网络闪断、MQ Broker端异常等原因导致 回送消息失败或者异常。这个时候就需要发送方(生产者)对消息进行可靠性投递了,保障消息不丢失,100%的投递成功!(有一种极限情况是闪断,Broker返回的成功确认消息,但是生产端由于网络闪断没收到,这个时候重新投递可能会造成消息重复,需要消费端去做幂等处理)所以我们需要有一个定时任务,(比如每5分钟拉取一下处于中间状态的消息,当然这个消息可以设置一个超时时间,比如超过1分钟 Status = 0 ,也就说明了1分钟这个时间窗口内,我们的消息没有被确认,那么会被定时任务拉取出来)
step 6: 接下来我们把中间状态的消息进行重新投递 retry send,继续发送消息到MQ ,当然也可能有多种原因导致发送失败
step 7: 我们可以采用设置最大努力尝试次数,比如投递了3次,还是失败,那么我们可以将最终状态设置为Status = 2 ,最后 交由人工解决处理此类问题(或者把消息转储到失败表中)。

具体的技术实现细节参考慕课视频《RabbitMQ消息中间件极速入门与实战》

Reference:

-------------本文结束感谢您的阅读-------------
Thank you for your encouragement