RabbitMQ 应用问题 - 消息可靠性保障 (思路)
- 消息可靠性保障
- 消息补偿机制
- 需求:
- 100%确保消息发送成功
-
消息可靠性保障–消息补偿
-
步骤(正常情况):
- Producer先入库
- 发送消息给Q1
- Consumer会拿着Q1的消息去消费
- Consumer消费之后也操作自己的数据库
-
步骤(不正常情况):
- Producer先入库
- 发送消息给Q1(失败)
- Consumer收不到消息(操作同样失败)
- 不会发送确认消息
-
全套步骤:
- Producer先入库
- 发送消息给Q1
- Consumer会拿着Q1的消息去消费
- Consumer消费之后也操作自己的数据库
- Consumer发送确认信息(转换角色变成生产端)
- Consumer发送消息给Q2
- 监听确认消息
- 将消息写入到消息的数据库表里
- 此时延迟发送消息Q3(
等上两三分钟
) - 但是我们的回调检查服务也监听着Q3
- 收到的消息跟Q1、Q2消息的id是一样的
- 回调检查服务比对当前的消息和刚才写入的消息id是否一致,如果一直该消息肯定被消费过的
- 如果一致则不管
- 如果不一致回调检查服务跟Priducer说一声让它重新发(重新走2,3)
- 如果发送消息和延迟发送都失败了
- 我们有定时检查服务
- 比如一个小时
- 我们就去检查消息写入数据库MDB和业务数据库DB的数据是否匹配
- 如果都没发出去,业务DB的消息肯定比MDB的消息要多
- 那么我们定时检查服务去通知Producer重新发送消息
- 比如一个小时
- 我们有定时检查服务