抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

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

  • 保障消息成功发出
  • 保障mq节点的成功接收
  • 发送端收到mq节点(Broker)确认应答
  • 完善的消息进行补偿机制

生产端可靠性投递

  • 消息落库,对消息状态进行打标. 把数据持久化到数据库,对状态进行记录.
  • 消息的延迟投递,做二次确认,回调检查.
  1. 业务数据和消息标记入库.
  2. 生产者发送消息.
  3. MQ确认收到消息,发送确认信息给生产者(生产者异步监听响应). 假如这步骤突然断了(RPC通信),这时候生产端那边,消息的状态还是0,所以在这应该设置一个临界值,例如,5分钟后,如果消息还是0的状态,通过分布式定时任务来保证同一个时间点,只有一个线程获取db数据,如果获取到0,再重新发送消息到MQ. 同时也要设置一个重试的机制,重试超过一个值之后就不再重试了,丢失的消息可以人工修复.
  4. 更新消息状态,从0改为1,表示确认消息已经投递成功了.

此模式在高并发的模式下不合适,因为有两次的数据库操作. 假如数据库的操作在核心链路消耗的200ms,这样肯定不行的,这种情况下就可以使用消息的延迟投递,做二次确认,回调检查,实际目的是减少数据库的操作.

  1. 先业务代码入库,再发送消息. 这个时候其实是产生2个消息的,第二个消息是延迟发送的,也就是延迟消息的投递.
  2. MQ收到消息后,消费者监听到有消息,接收,发送确认消息给MQ.
  3. 回调服务监听MQ是否有收到确认消息,检查确认消息,如果没有的话向上游发送再次投递指令.

评论