如何保障消息 100% 投递成功?
2019-09-26 本文已影响0人
qyfl
可靠性投递需要四个部分:
- 保障消息的成功发出
- 保障 MQ 节点成功接收
- 生产者收到 MQ 节点(Broker)确认应答
- 消息补偿机制
方案一:
消息先入库,对消息的状态进行标记。
- 消息先入库,对消息的状态进行标记。例如:status1
- 向 MQ 发送消息。
- MQ 将应答发送给生产端,生产端要监听 MQ 的应答。
- 如果收到了确认的应答。那么修改消息的状态为发送成功。
- 如果没有收到 MQ 应答,需要有一个定时任务捞取 status1 状态的消息再次发送。这个时候消息需要有最大的重试次数的限制。
流程如下图所示:
方案一.png
方案二:
消息的延迟投递,做二次确认,回调检查。
- 先把消息发送给 MQ 的队列 A。
- 延迟一定的时间第二次发送一样的消息给 MQ 队列 B。B 是 A 的备份。
- 有一个单独的服务(callback service)监听 MQ 队列 A 的响应。并且接受队列 B 的消息。
- 如果 callback service 收到了队列 A 的消息确认,那么入库标记。
- 延迟投递的消息开始发送到 B 队列。
- callback service 收到队列 B 中的数据,去数据库里查询这个消息的状态
- 如果状态不是成功则 callback service 则通知生产者,该消息没有收到响应。
- 生产者如果收到 callback service 的消息。那么就走计数,补偿,告警等步骤。
流程如下图所示:
方案二.png