(二)分布式事务?No, 最终一致性(2)

最终一致性解决方案

1. 两阶段提交

2.异步确保(没有事务消息)

3.异步确保(事务消息)

4. 补偿交易(Compensating  Transaction)

5.消息重试

6.幂等(接口支持重入)

A给B转100元。

1. 两阶段提交

有协调者,协调操作流程。Pre commit资源,commit或rollback时提交或释放资源。

调用A的commit接口超时了,继续重试。要求下游接口幂等。下游故障,短时重试不能解决,定时处理中间状态:扔到重试MQ。重试策略,失败返回

2.异步确保(没有事务消息)

不只为一致性考虑响应时间下游稳定性

关键要有消息表。一般有队列(不丢消息,但不支持事务消息),基本思路

生产方消息表记录消息发送状态和数据一个事务提交(存储耦合)。只是增加一个字段业务强耦合,处理不同交易数据可通用处理

消费方需处理消息成功,给生产方confirm失败放MQ支持重试省事儿,不支持回队尾或建队列处理。如成功才继续,block(不会这么做)。Kafka lowlevel接口是支持自己设置offset的,可实现block。

生产方定时扫描本地消息表,没处理完的消息由发送一遍自动对账补账,这一步可省略。丢消息或者下游处理失败场景少。看业务上能不能容忍不一致到对账补账周期。

ps:不要MQ脚本处理低频场景,离线扫表让人不爽。业务量初期也可以

一致性要求不高兜底方案(对账补账),不需要confirm扔给消息万事大吉

3.异步确保(事务消息)

理想:消息扔到MQ,肯定被消费成功不用担心失败丢失

现实:处理失败继续消费直到成功为止

大部分MQ都不支持事务消息比如kafka。RocketMQ号称支持,事务消息关键封装消息状态和重发等。没成熟事务消息MQ。网传RMQ提供2PC提交接口。

1.生产方发送prepared消息给RMQ失败返回

2.执行本地事务,成功发Confirm消息给RMQ失败,调用RMQ cancel接口。

3.步超时如何处理呢?第四步骤

4.生产方实现check接口告知RMQ自己本地事务是否执行成功(第4步)。定时轮训pre消息,调用check接口,决定是否可提交

5.可能失败。这时候需要RMQ支持消息重试。处理失败的消息果断时间再进行重试,直到成功为止(超过重试次数后会进死信队列,可能得人肉处理了,因为没用过所以细节不是很了解)。

支持消息重试

P.S. 阿里内部因历史原因,用notify比RMQ要多,原理类似。

4. 补偿交易(Compensating  Transaction)

和操作本身一个事务里完成。跟2PC比,核心价值少锁代价

如A:-100  B:+100。如B:+100失败,补偿A:+100。看起来跟注册个单库事务一样简单。做到业务无感知。

5.消息重试

事务消息解决生产者和MQ之间一致性,重试确保消费者MQ之间的一致性

pullpush模式。失败,放重试队列延迟时间固定(2s),队首消息时间到达才被消费

时间为水位,期望执行时间大于当前时间的消息高于水位。其他消息consumer不可见。如消息延迟时间不一样:

(1)基于队列方案:按秒建多个队列。按执行时间不同队列,一天86400个队列(一般丑陋)。按时间消费不同队列

(2)基于DB:不依赖队列,支付时消息进去时候,设置下次执行时间,时间做索引

(3)redis的延时队列,支持重试zset处理时间排序。遇到的持久化问题,内存数据丢失问题,重试次数控制,消息追溯等

总结:MQ提供消息重试最好

6.幂等(接口支持重入)

没有MQ,重试也是无处不在的。幂等怎么做?

insert依赖唯一键异常回滚事务

update,那么状态机控制和版本控制异常重要。这里要多加小心。

引入log表。该log对操作id(消息id?)插入log失败整个回滚

不能查log表或者用redis,加锁。除非在事务里查。唯一键冲突回滚掉就好

用唯一键挡重入是目前为止个人觉得最有安全感的方式。当然对数据库会有一些额外性能损耗。问题就变成了有多大的并发,其中又有多大是需要重试的?

Fasion IO卡+分库分表之后,不会到db性能瓶颈(对金融类场景)。

后记

最终一致性问题,万恶之源是RPC本身会失败。生涯大部分时间都会跟各种失败和timeout搏斗了。用MQ实现最终一致性原因:

1. MQ强大,可不丢数据。对事务消息更普及。

2. 异步处理能力(响应时间、吞吐量)和稳定性(99.99%的服务依赖99.9%的服务)服务之间解耦

https://zhuanlan.zhihu.com/p/25933039

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容