消息如何保证100%投递成功
- 保障消息成功发出
- 保障mq节点的成功接收
- 发送端收到mq节点(Broker)确认应答
- 完善的消息进行补偿机制
生产端可靠性投递
- 消息落库,对消息状态进行打标. 把数据持久化到数据库,对状态进行记录.
- 消息的延迟投递,做二次确认,回调检查.
- 业务数据和消息标记入库.
- 生产者发送消息.
- MQ确认收到消息,发送确认信息给生产者(生产者异步监听响应). 假如这步骤突然断了(RPC通信),这时候生产端那边,消息的状态还是0,所以在这应该设置一个临界值,例如,5分钟后,如果消息还是0的状态,通过分布式定时任务来保证同一个时间点,只有一个线程获取db数据,如果获取到0,再重新发送消息到MQ. 同时也要设置一个重试的机制,重试超过一个值之后就不再重试了,丢失的消息可以人工修复.
- 更新消息状态,从0改为1,表示确认消息已经投递成功了.
此模式在高并发的模式下不合适,因为有两次的数据库操作. 假如数据库的操作在核心链路消耗的200ms,这样肯定不行的,这种情况下就可以使用消息的延迟投递,做二次确认,回调检查,实际目的是减少数据库的操作.
- 先业务代码入库,再发送消息. 这个时候其实是产生2个消息的,第二个消息是延迟发送的,也就是延迟消息的投递.
- MQ收到消息后,消费者监听到有消息,接收,发送确认消息给MQ.
- 回调服务监听MQ是否有收到确认消息,检查确认消息,如果没有的话向上游发送再次投递指令.