啥?分布式啥?啥事务?
二将军问题
「情形1」:送信失败,如下图所示,左侧白军穿过山谷的时候被黑军俘虏了,右侧白军仍旧不知道左侧白军的进攻信息。
「情形2」:送信成功,回信失败。如下图所示,左侧白军穿过山谷将信息成功通知给右侧白军,但是右侧白军携带"收到命令"的信息,穿过山谷向左侧白军通知的时候被黑军俘虏了,此时左侧白军不知道右侧白军是否接收到进攻命令。
「情形3」:送信成功,回信成功,如下图所示,白军胜利毫无疑问。
面对不稳定的信息传输通道(山谷中的黑军),要完成两股白军的通信是有难度的,送信回信的过程就好比我们系统中Send和Ack 的过程,并且只要送信或者回信任意一次失败,整个信息传递就标志着失败,无法完成进攻,这像不像CAP的最佳打开方式 中提到的原子性,事务中的每个操作都成功,事务才会提交。 如果真的发生了情形1和情形2,如果你是左侧白军的统帅或者右侧白军的负责人,你该怎么办呢?是不是应该等等,看看有没有回信,如果长时间没有回信就认为这个送信的人被俘虏了,再派1个人重复送信的过程,这就是我们在系统中常见的超时重试。当然 重试一定是有限制
的,如果真的无限重试。那么左右侧白军人数有可能会清零(资源耗尽),战争自然失败(系统自然崩溃)如果左侧白军派遣多名士兵同时发起送信的动作,那么对于右侧白军来说不管收到多少次信息,都只进攻一次。类比咱们系统来说,对于不管是一次请求还是多次请求,结果都是一样的,这就是 系统幂等性
这个二军问题,像不像TCP链接的握手的过程呢?问题来了, 为什么是三次握手,而不是两次握手?
文章留言回复下,如果你不知道可要补课啦
本地事务
分布式事务
资源管理器(Resource Manager, RM)即事务参与者 事务管理器(Transaction Manager, TM)即事务协调者
一个TM会管理多个RM
,就类似上面我们的超市促销支付的逻辑去协调多方数据库资源,从而协调各个本地事务的进度,使其共同提交或回滚,最终达成一种全局的 ACID 特性
。两种事务的区别
分布式事务的场景
「资源主导」
「服务依赖主导」
「混合主导」
分布式事务的分类
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
评论