每天进步一点点【基于消息的最终一致性】

在一些对数据一致性要求较高的场景中,经常采用基于消息的最终一致性方案,通过消息中间件来保证上、下游应用数据操作的一致性。

图片

主要流程如下:

(1)在执行业务操作时,记录一条消息数据到数据库(状态为“待发送”),并且消息数据的记录与业务数据的记录必须在数据库的同一个本地事务内完成(这是该方案的核心保障)。

(2)在消息数据记录完成后,通过一个定时任务轮训状态为“待发送”的消息,然后将待发送的消息投递给消息队列。

(3)如果在这个过程中消息投递失败,则启动重试机制,直到成功收到消息队列的ACK确认后,再将消息状态更新为“己发送”或者删除消息。

(4)如果下游系统消费消息失败,则不断重试,最终做到两个系统数据的最终一致性。上述流程保证了:只要订单创建成功,就一定会发送一条消息到MQ,下游的消息消费者就一定可以收到这条消息并完成业务处理,从而保证了上下游系统数据的一致性。

基于消息的最终一致性方案的主要的缺点是:对应用侵入性很强,应用需要进行大量的业务改造,成本较高。

如有疑问,可以通过公众号【Java与大数据学习】联系我