work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

RabbitMQ 消息如何保障100%的投递成功

Posted on 2020-07-29 15:40  work hard work smart  阅读(411)  评论(0编辑  收藏  举报

一、消息如何保障100%的投递成功

1、什么是生成端的可靠性投递

  保障消息的成功发出

  保障MQ节点的成功接收

  发送端收到MQ节点(Broker)确认应答

  完善的消息进行补偿机制

 

方案1: 消息信息入库,对消息状态进行标记

 

BIZ DB: 业务DB

MSG DB: 消息DB

这两个DB可以放在一个DB里。

Step1 记录要发送的消息到MSG DB,标记消息状态为0

Step2: 向MQ发送消息

Step3: MQ异步发送确认消息到生产者

Step4: 生产者接受到确认消息,将消息标记为1,代表该消息已经确认过了。

Stop5: 抓取状态为0(未确认的)的消息(超过5分钟的消息)

Stop6: 重新发送消息

Step7: 重试次数超过3次, 状态改为2,代表重试出错。这个是极端情况,可以人工处理。如果是业务逻辑错误,则修改业务逻辑。

 

缺点: 不适合高并发场景,对消息进行入口,更新消息,增加了IO负担。 

 

方案2: 消息的延迟投递,做二次确认,回调检查

 

 

 

1.发送消息(生成两条消息 第一条真实消息,第二条消息,延迟确认的消息,可能延迟消息可能会在第2分钟或者第三分钟后发送)

2.broker接收消息

3.监听的消费端接收消息

4.消费端处理完消息之后,发送一个确认消息到broker

5.监听确认消息的消息队列,接收确认消息,Callback服务接收到,存储到数据库

6.延迟投递的消息发送了,被Check Detail监听到,Callback服务接收到,检查数据库是否存储

7.检查到没有储存,重发该消息,ReSend一次这个消息

8.重走该流程