本地消息表(最常用的解决方案)

 

 
 
 
 
 

最初是由ebay提出的。

核心是把大事务转变为小事务,逻辑如下:

举例说明:我拿100元去买一瓶水

1. 当你扣钱的时候,你需要在你扣钱的服务器上新增加一个本地消息表,你需要把你扣钱和减去水的库存写入到本地消息表,放入同一个事务(依靠数据库本地事务保证一致性)。

2. 这个时候有个定时任务去轮询这个本地事务表,把没有发送的消息,扔给商品库存服务器,叫它减去水的库存,到达商品服务器之后,这时得先写入这个服务器的事务表,然后进行扣减,扣减成功后,更新事务表中的状态。

3. 商品服务器通过定时任务扫描消息表或者直接通知扣钱服务器,扣钱服务器在本地消息表进行状态更新。

4. 针对一些异常情况,定时扫描未成功处理的消息,进行重新发送,在商品服务器接到消息之后,首先判断是否是重复的。

如果已经接收,再判断是否执行,如果执行在马上又进行通知事务;如果未执行,需要重新执行由业务保证幂等,也就是不会多扣一瓶水。

本地消息队列是 BASE 理论,是最终一致模型,适用于对一致性要求不高的情况。实现这个模型时需要注意重试的幂等。

基于 Kafka 实现分布式事件驱动:https://www.toutiao.com/a6660379565375881741/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1553775437&app=news_article&utm_source=weixin&utm_medium=toutiao_android&group_id=6660379565375881741

posted @ 2022-01-04 23:26  ArielMeng  阅读(780)  评论(0编辑  收藏  举报