RabbitMQ:生产端和消费端的可靠性投递解决方案

消息如何保证100%的投递成功?

什么是生产端的可靠性投递?
  • 保障消息的成功发出;
  • 保障MQ节点的成功接收;
  • 发送端收到MQ节点(Broker)确认应答;
  • 完善消息补偿机制;
生产端可靠性投递常见解决方案
  • 消息落库,对消息状态进行打标

       将消息存入数据库,记录消息的状态。可以通过轮询不断获取消息的状态,从而保证消息的成功投递。如下图示所示,这样做有一个很严重的问题就是要多次操作数据库,对于一些高并发、对性能要求较高的业务,这种方式是不太合适的。因为频繁操作数据库会带来严重的性能问题。

在这里插入图片描述

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

生产端会发送两次消息:
      第一次:生产端首先会将业务数据存入DB,之后会向MQ发送一个消息,消费端收到消息后发送确认消息(这里的确认消息不是指ack,而是重新编辑发送一条新消息),回调服务监听到确认消息后将消息存入DB;
       第二次:在第一条消息发送出去后一段时间,生产端会再发送一条check消息,回调服务监听到check消息后会检查第一条消息的执行情况,如果消息未能按照预期结果执行的话,回调服务会给生产端发送一条指令让生产端重新发送消息;
       如下图所示,这种方法可以有效的避免对数据库的频繁操作,从而提高性能;同时业务DB和消息DB之间解耦;

在这里插入图片描述

消费端幂等性保障:

唯一ID+指纹码机制,利用数据库主键去重
  • 好处:实现简单;
  • 坏处:高并发下有数据库写入的性能瓶颈;
  • 解决方案:利用ID进行分库分表进行算法路由;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值