RabbitMQ消息可靠性投递

消息落库,对消息状态打标。+轮训

状态0,未处理,1:已经处理,2:失败(需要补偿机制)。

image

  1. 将业务订单数据和生成的Message进行持久化操作
  2. 将Message发送到Broker服务器中
  3. 通过RabbitMQ的Confirm机制,在producer端,监听服务器是否ACK。
  4. 如果ACK了,就将Message这条数据状态更新为已发送。如果失败,修改为失败状态。
  5. 分布式定时任务查询数据库3分钟(这个具体时间应该根据的时效性来定)之前的发送失败的消息
  6. 重新发送消息,记录发送次数
  7. 如果发送次数过多仍然失败,那么就需要人工排查之类的操作。

优点:

能够保证消息百分百不丢失

缺点:

第一步中涉及到分布式事务问题,分布式事务一点会降低时效性。

消息的延迟投递,做二次确认,回调检查。

image

流程图中,颜色不同的代表不同的message

  1. 将业务订单持久化
  2. 发送一条Message到broker(称之为主Message),再发送相同的一条到不同的队列或者交换机(这条称为确认Message)中。
  3. 主Message由实际业务处理端消费后,生成一条响应Message。之前的确认Message由Message Service应用处理入库。
    4~6. 实际业务处理端发送的确认Message由Message Service接收后,将原Message状态修改。
  4. 如果该条Message没有被确认,则通过rpc调用重新由producer进行全过程。

优点:

相对于数据库持久化方案来说响应速度有所提升

缺点:

系统复杂性有点高
万一两条消息都失败了,消息存在丢失情况,仍需Confirm机制做补偿


文章作者: 凌云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 凌云 !
  目录