如何保证消息一致性
消息发送一致性
消息发送一致性是指业务操作成功了,有这个操作产生的消息一定要发送出去,否则就丢失消息了
会出现的问题?
- 业务操作成功了,但是此时应用宕机,导致消息没有发送出去
- 业务成功了,消息发送时消息系统挂掉了,导致消息没有发送出去
如何解决?
- 业务处理应用首先把消息发送给消息中间件,标记消息的状态为未处理
- 消息中间件收到消息,将消息存储在消息存储中,但是不进行消息投递
- 消息中间件返回消息入库成功/失败
- 业务放收到消息中间件返回结果进行处理
- 收到的结果为失败,则放弃业务处理
- 收到的结果为成功则进行业务处理
- 业务处理完成后,把结果发送给消息中间件
- 消息中间件收到业务处理的结果,根据结果进行处理
- 如果业务失败,则删除消息存储中的消息
- 如果业务成功,则将消息存储中的消息状态改为可发送,进行消息投递
消息处理时要进行持久化操作,表示收到消息了,此时就可以恢复给发布者消息已收到,然后在进行业务操作,如果业务操作失败,则进行补偿机制(定时任务),重新执行失败的任务