专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

一文替你解决分布式系统数据一致性的烦恼

  一:分布式消息怎么保证数据的最终一致性:1。1添加消息中间表方案:
  为了保证原子性,我们可以变通一下,添加一个消息表,A不直接往消息中间件中发消息,而是把消息写入消息表,然后通过一个后台程序不断的把消息写入消息中间件。比如转账流程,如下图:
  这个后台应用会把消息表中的数据发送到消息中间件中,当然这里边我们要有一个字段标识出消息的状态,然后提供接口给消息中间件回调(ACK)来知道消息是否发送成功,如果失败就重试,可以保证:消息不会丢失顺序不乱但会有消息重复的情况,因为消息发送失败可能是写入失败,也可能是写入成功但响应失败,所以消息可能会重复,这个问题需要系统B来处理。1。2那么系统B要考虑那些问题呢:1。2。1消息丢失
  系统B从消息中间件中拿到消息,还没处理完就宕机了,这条消息怎么办?需要通过ACK机制处理,消费成功的发送ACK,对于没有ACK的消息,消息中间件会再次推送。1。2。2消息重复:
  即使有ACK机制也存在消息重复的情况,比如B已经处理完一条消息,发ACK时失败了,那么这条消息就还会被推过来。还有就是上面说的后台程序发消息时可能重复。对于重复消息问题,可以加一个判重操作,记录处理成功的消息,每次收到消息时,先通过判重操作判断一下,如果重复了就不处理,实现幂等性。
  判重操作可以放一张表里,也可以放到redis里,存储一定时间,在相应时间里如果有重复消息进来,就认为消息重复,但是也要来考虑业务,比如订单有好多操作,可能要加各种场景的校验,为而不是简单的以订单号来判断重复,具体要细到什么维度就要看自己实际的真实业务来设定了。改造后流程图如下:
  二:分布式事务保证数据一致性
  常见分布式事务有2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知,我们这里重点介绍下主流的TCC和最大努力通知这两个2。1TCC
  如果要用TCC分布式事务的话:首先需要选择某种TCC分布式事务框架,各个服务里就会有这个TCC分布式事务框架在运行。
  所以你原本的一个接口,要改造为3个逻辑,TryConfirmCancel:先是服务调用链路依次执行Try逻辑。如果都正常的话,TCC分布式事务框架推进执行Confirm逻辑,完成整个事务。如果某个服务的Try逻辑有问题,TCC分布式事务框架感知到之后就会推进执行各个服务的Cancel逻辑,撤销之前执行的各种操作这就是所谓的CC分布式事务。
  TCC分布式事务的核心思想大白话的来说就是当遇到下面这些情况时:某个服务的数据库宕机了;某个服务自己挂了;那个服务的Redis、Elasticsearch、MQ等基础设施故障了。某些资源不足了,比如说库存或者限购不够这些。先来Try试一下,不要把业务逻辑完成,先试试看,看各个服务能不能基本正常运转,能不能先冻结我需要的资源。如果说Try的过程都OK,也就是说,底层的数据库、Redis、Elasticsearch、MQ都是可以写入数据的,并且你保留好了需要使用的一些资源(比如冻结了一部分库存或者限购)。
  接着,再执行各个服务的Confirm逻辑,基本上Confirm就可以很大概率保证一个分布式事务的完成了。那如果Try阶段某个服务就失败了,比如说底层的数据库挂了,或者Redis挂了,等等。此时就自动执行各个服务的Cancel逻辑,把之前的Try逻辑都回滚,所有服务都不要执行任何设计的业务逻辑。保证大家要么一起成功,要么一起失败。
  这里还有一个问题?如果有一些意外的情况发生了,比如说下单服务突然挂了,然后再次重启,TCC分布式事务框架是如何保证之前没执行完的分布式事务继续执行的呢?所以,TCC事务框架都是要记录一些分布式事务的活动日志的,可以在磁盘上的日志文件里记录,也可以在数据库里记录。保存下来分布式事务运行的各个阶段和状态。
  另外一个问题,万一某个服务的Cancel或者Confirm逻辑执行一直失败怎么办呢?那也很简单,TCC事务框架会通过活动日志记录各个服务的状态。
  就比如下边例子,比如发现某个服务的Cancel或者Confirm一直没成功,会不停的重试调用它的Cancel或者Confirm逻辑,务必要它成功!如果是有相应bug,那无限重试也是不行的,这时候我们就要添加相应报警,然后就要人工介入了。
  TCCTryconfirm阶段正常情况:
  TCCTrycancel阶段,异常情况
  2。2TCC如何保证最终一致性TCC事务机制最重要的还是Try,Confirm确认操作和Cancel取消操作都是围绕Try而展开的。因此,Try中的操作其保障性是最好的,即使失败了,仍然有Cancel取消操作将已经执行的操作撤销。Try阶段执行成功并开始执行Confirm阶段时,一致认为Confirm阶段是不会出错的,也就是说只要Try成功,Confirm一定成功,这是设计之初的定义。Confirm与Cancel如果失败,由TCC框架进行重试补偿存在极低概率在Confirm和Cancel环节彻底失败,则需要上边说的报警和人为介入了。2。3TCC的要注意的事项允许空回滚:什么是空回滚,比如Try超时或者丢包,导致TCC分布式事务二阶段的回滚触发Cancel操作,此时事务参与者未收到Try,但是却收到了Cancel请求。也就是由于网络原因,下游服务没有收到Try操作,后续比如网络正常后收到了Cancel请求了。
  做好幂等:由于网络原因或者重试操作都有可能导致Try,Confirm,Cancel3个操作重复执行,所以在使用TCC时要考虑到这三个操作相应的幂等控制,通常我们可以使用事务xid或业务主键判重来控制,避免影响业务。2。4TCC方案的优缺点
  优点:
  性能提升:由业务来实现,资源的控制粒度变小,不会锁定整个资源。保证了数据最终一致性:基于Confirm和Cancel的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。可靠性:由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群概念。
  缺点:
  TCC中Try、Confirm和Cancel操作功都是基于业务来实现,业务耦合度较高,提高了开发成本。三:基于本地消息的最终一致性:3。1解释:
  本地消息表的核心思想就是将分布式事务拆成本地事物来处理,在方案执行中束腰有两种角色:事务发起方和事务被动接收方。事务主动发起方需要额外新建事务消息储存表,并在本地事务中完成业务处理和记录事务消息,并轮询事务消息表的数据发送事务消息,事务被动接收方则是基于消息中间件消费事务消息表中的事务,处理自己的业务。
  这样可以避免以下两种情况导致的数据不一致性:
  业务处理成功、事务消息发送失败业务处理失败、事务消息发送成功3。2简化流程图
  1事务发起方在同一个本地事务中处理业务和写消息表操作2事务发起方通过消息中间件,通知事务被动方处理事务消息。消息中间件可以基于Kafka、RocketMQ等消息队列,事务主动方主动写消息到消息队列,事务消费方消费并处理消息队列中的消息。3事务接收方通过消息中间件,通知事务主动方事务已处理的消息。4事务接收方接收中间件的消息,更新消息表的状态为已处理。
  一些必不可少的容错机制如下:
  当1步骤处理出错,由于还在事务主动方的本地事务中,直接回滚即可。当2,3步骤处理出错,由于事务主动发起方本地保存了消息,只需要轮询消息重新通过消息中间件发送,通知事务被动方重新读取消息处理业务即可。如果是业务上处理失败,事务被动接收方可以发消息给事务主动方回滚事务。如果事务被动接收方已经消费了消息,事务主动发起方需要回滚事务的话,需要发消息通知事务主动发起方进行回滚事务。
  本地消息表的优缺点:优点:
  从业务设计的角度实现了消息数据的可靠性,消息数据的可靠性不依赖于消息中间件,弱化了对MQ的依赖。方案比较轻量,容易实现。
  缺点:
  耦合了具体场景的业务,不可公用消息数据与业务数据同库,业务数据量大的时候会有影响业务系统在使用关系型数据库的情况下,消息服务性能会受到关系型数据库并发性能的局限
  这个版本相对比较简陋,只是大体的显现出来了轮廓,下图是改进版本。3。3本地消息一致性升级版本
  基于本地消息的最终一致性方案的最核心做法就是在执行业务操作的时候,记录一条消息数据到DB,而且消息数据的记录一定要和业务数据的记录在同一个事务内完成,这是该方案的前提核心保障。在记录完成后消息数据后,我们就可以通过一个定时任务到DB中去轮询状态为待发送的消息,然后将消息投递给MQ。这个过程中可能存在消息投递失败的可能,此时就依靠重试机制来保证,直到成功收到MQ的ACK确认之后,再将消息状态更新或者消息清除;而后面消息的消费失败的话,则依赖MQ本身的重试来完成,其最后做到两边系统数据的最终一致性。基于本地消息服务的方案虽然可以做到消息的最终一致性,但是它有一个比较严重的弊端,每个业务系统在使用该方案时,都需要在对应的业务库创建一张消息表来存储消息。针对这个问题,我们可以将该功能单独提取出来,做成一个消息服务来统一处理,因而就衍生出了我们下面将要讨论的方案。四:独立消息服务的最终一致性
  事务主动方在执行业务前预发消息事务发起方,执行相应业务消息服务系统接受到消息存储,并且将消息状态置为待发送状态事务主动方主动发送业务处理结果,或者消息服务系统定时去轮询事务发起方业务处理结果得到事务发起方业务处理结果发送消息到MQMQ消息持久化防止丢失确认消息被投递到MQ,得到ACK信息事务接收方得到投递的消息事务接收放得到投递的消息执行相应业务执行完后返回ACK信息独立消息服务最终一致性与本地消息服务最终一致性最大的差异就在于将消息的存储单独地做成了一个RPC的服务;这个过程其实就是模拟了事务消息的消息预发送过程,如果预发送消息失败,那么生产者业务就不会去执行业务,因此对于生产者的业务而言,它是强依赖于该消息服务的。不过要保证好独立消息服务高可用则要做成HA的集群模式,就能够保证其可靠性。在消息服务中,还有一个单独地定时任务,它会定期轮训长时间处于待发送状态的消息,通过一个check补偿机制来确认该消息对应的业务是否成功,如果对应的业务处理成功,则将消息修改为可发送,然后将其投递给MQ;如果业务处理失败,则将对应的消息更新或者删除即可。因此在使用该方案过程中,事务发起方必须同时实现一个check服务,来供消息服务做消息的确认。对于消息的消费,该方案与上面的处理是一样,都是通过MQ自身的重发机制来保证消息被消费。五:总要有总结
  使用场景:TCC:适用于执行时间确定且较短,实时性要求高,对数据一致性要求高,比如互联网金融企业最核心的三个服务:交易、支付、账务。本地消息表MQ事务:适用于事务中参与方支持操作幂等,对一致性要求不高,业务上能容忍数据不一致到一个人工检查周期,事务涉及的参与方、参与环节较少,业务上有对账校验系统兜底。
  本章讲述了常见分布式系统数据一致性方案,从数据库,到MQ,从TCC到本地消息最终一致性方案,再到独立消息服务最终一致性,系统复杂性也随之增强,但是业务得到了解耦专注于某一块业务。但是实际应用中要根据自己系统的真实情况去选用方案,才能做到因地制宜,得到相对比较好的结果。

今日公测!坦克连C系坦克资料片,六大福利助力激战坦克大战场,人多更好玩!网易15V15坦克大战场对抗手游坦克连C系坦克资料片公测今日震撼开启!东方战魂热血沸腾,全新C系战车集结等你征召诚意满满,六大开服福利助力长官全身心投入坦克华为Mate50和iPhone14神仙打架,这次我选华为时隔两年,华为官方宣布Mate50系列将于9月6日召开新品发布会,随之而后,苹果也确定了iPhone14系列的新品发布时间,两家科技巨头的发布会仅相差一天时间,小伙伴你们更期待哪个复星系大比例减持永安财险26股权,实控人陕西国资接盘记者苗艺伟9月9日,永安财险在中国保险行业协会连续发布三份公告,披露其股东变动的最新情况。复星系旗下机构股东正在大幅度减持永安财险股权,并转让给陕西国资旗下的机构股东。若此轮股权变这些不知不觉伤肝的行为可能你每天都在做肝脏是个沉默的器官,具有代谢解毒调节血液等诸多作用,在维持人体健康过程中起着非常重要的作用。但是在日常生活中,总有一些行为会悄无声息地伤害我们的肝脏,而我们却一无所知!01hr睡眠2022沃德十佳发动机榜单,5台内燃机上榜,包括德系美系韩系沃德十佳是比较权威的发动机排行榜单,由沃德的汽车世界杂志评选,每年选出世界上最好的10款发动机,从1994年延续至今,在2个月的测试期间,沃德编辑根据日常驾驶情况下的客观和主观标准绿茶女具备的哪些特质,会让男人上瘾?建议男生花一分钟看完导语之前有一段时间网上特别流行一个称呼,那就是白莲花,形容一个人心机生产,却表现得跟一朵白莲花一样单纯,特指用来形容女人,而这种女人往往在男人的心目中是特别高洁的,就像是白月光一样俄罗斯罕见妥协,将用亚速营俘虏换人?乌克兰守军或可获救?亚速钢铁厂撤出的亚速营俘虏即将获救?俄罗斯罕见妥协,要用亚速营救人?这到底是什么情况?自从5月16日,亚速钢铁厂的乌克兰守军陆续开始撤出,并向俄军投降之后,迄今为止,亚速钢铁厂已经铁人王进喜,47岁英年早逝,留下的妻子5个子女现状如何?宁可少活二十年,拼命也要拿下大油田或许现在的年轻人们已经不再对这句话以及说出这句话的人耳熟能详了,但这样一个人一句话是不容忘却的,这个人就是铁人王进喜。他将自己短暂又充满激情的四十民间故事王善人家中闹鬼,知县上门捉鬼,挖开竹林下面有块石板明朝万历年间,在福建的连江县有个名叫王巍山的员外,他家良田千顷,骡马成群,是连江县的首富。每当遇到大灾之年,贾员外就会在城中各处安排粥棚,为那些受灾的百姓舍粥散粮,连江县城内人人都热巴近视?罗云熙休假?张天爱资源咖?张杰包场?1。迪丽热巴的近视和散光都挺严重的,有时候得眯着眼睛才能看清。2。满江红已于山西太原置景,6月底开机,主演易烊千玺,沈腾于和伟雷佳音于谦岳云鹏。3。罗云熙还在休假期,他现在当务之急博士考协警就是浪费资源博士考协警就是浪费资源有人说,博士考协警是为了编制。看到一个报道,说清华博士考协警,硕士考协警。第一个问题,协警的定位是辅助警力,属于群防群治队伍,不具有行政执法权。第二个问题,协
抗日老兵娶日本女战俘,隐居四川几十年,晚年意外获得百亿资产很多人说有能力不如有背景,虽然说这句话并不一定是对的,但很多时候你会发现如果父母足够有能力,孩子就会少走很多弯路,眼界也会更开阔。上个世纪80年代初期中国有一个农民带着儿子去日本看日本东京生活舒适环境优美,交通方便,消费服务一流日本是一个历史悠久的国家,有着悠久的文化,许多世界名胜也都位于日本。虽然很多人都说日本是天朝上国,而且日本在历史上还曾发生了不少令国人印象深刻的故事。不过最近关于日本的消息也越来越日本侵略我国14年,有8个省没有被占领,你知道哪8个吗?日本侵略者,曾在上个世纪三十年代,给中国带来了非常大的灾难。很明显,自日军宣布入侵中华以来,无数民众深受其害,民间甚至传出了这样的说法日本人所到之处,寸草不生!从这里,我们便能看出德国科学家找到储氢问题的解决方案盐氢是最理想的清洁燃料,它可以由越来越容易越来越丰富的太阳能光伏电力来分解水来产生(电解过程),受控方式燃烧后产生的副产品仅仅是对我们有利用价值的水,零排放没有任何对空气环境的不良影明朝锦衣卫的末日40名大小头目全部死亡,一天之内组织便被消灭看到这个题目的读者,可能会心头一震!这么有名的一个情报组织皇帝的亲信侍卫,竟然一夜之间全部被杀害?大家应该都知道,在电影四大名捕中,诸葛正我培养了一种暗杀组织,他手下的四大名捕为诸这种花,有几千年的文化底蕴,就在我们身边你知道吗?甘菊,又名岩香菊,在太行山脉深秋的田野上,随处可见。今年的盛开,是在重阳节雨后,天气转凉之际,且看小溪畔,高崖边,门前屋后,次第披上了黄金甲。秋丛绕舍似陶家,遍绕东篱日渐斜。开车回各价位哪款OPPO最值得买?推荐以下这几款,款款让你爱不释手OPPO是国内手机的重要品牌,他有一加真我两个子品牌,那么购买OPPO手机时,应该买哪个最好?今天就盘点一下10004500元价位的手机吧。一起看看哪个最适合你。这些手机流畅运行3日元贬值已不再是跌多少的问题?小心这一全球市场核爆按钮随着美元兑日元汇率30多年来首次升破150,这个全球外汇市场年内最受瞩目的货币对走势,如今显然已经不再单单是日本决策层需要烦恼的问题,甚至一不小心,就可能在全球市场投下一颗当量足以美联储加息传言扰乱市场,比特币链上指标正在触底跟踪其市场与公允价值的关键比特币指标,以及长期持有者的信心,暗示市场底部形成。比特币和其他风险较高的资产在10月21日下滑,因为交易员仔细研究了表明美联储将继续加息的宏观指标。尽管阿里巴巴豪掷50亿元买船,航运市场混得风生水起可能看到这个标题,大家都会有些疑惑,阿里巴巴什么时候又搞航运业了,难道它不是互联网巨头吗?诶,是没错,但阿里系家大业大还真就看上了航运市场这一份大蛋糕。具体是怎么一回事呢?赶紧跟着央行对人民币汇率是否也要做出相应的行动了?今年以来人民币贬值速度着实有点大了,虽比不上欧元和日元,但是也是确实也不小了,对我国进口行业或多或少有点影响。虽我国是贸易出口大国,同时我国也是贸易进口大国,贸易的这把双刃剑需要用
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网