双十一是怎么保证高并发,分布式系统中,数据一致性

作者&投稿:称茜 (若有异议请与网页底部的电邮联系)
天猫双十一是怎么保证高并发,分布式系统中,数据一致性的~

VPLEX的技术核心是“分布式缓存一致性”,下图则是“分布式缓存一致性”技术的工作机制示意:正是因为这项核心技术优势,使得VPLEX方案和目前所有厂商的虚拟化方案截然不同,并能够实现异地的数据中心整合。对跨数据中心的所有负载实现跨引擎的平摊或者实时迁移,来自任何一个主机的I/O请求可以通过任何一个引擎得到响应。  缓存一致性的记录目录使用少量的元数据,记录下哪个数据块属于哪个引擎更新的,以及在何时更新过,并通过4K大小的数据块告诉在集群中的所有其他的引擎。在整个过程中实际发生的沟通过程,远远比实际上正在更新数据块少很多。分布式缓存一致性数据流示意图:上方是一个目录,记录下左侧的主机读取缓存A的操作,并分发给所有引擎,右侧主机需要读取该数据块时,会先通过目录查询,确定该数据块所属的引擎位置,读取请求会直接发送给引擎,并直接从数据块所在的缓存上读取。  当一个读请求进入时,VPLEX会自动检查目录,查找该数据块所属的引擎,一旦确定该数据块所属的引擎位置,读的请求会直接发送给该引擎。一旦一个写入动作完成,并且目录表被修改,这时另一个读请求从另一个引擎过来,VPLEX会检查目录,并且直接从该引擎的缓存上读取。如果该数据仍然在缓存上,则完全没必要去磁盘上读取。  如上图,来自图中左侧主机的操作,由CacheA服务,会记录一个更新状态,并分发给所有所有引擎知道。如果读取的需求来自最右侧的服务器,首先通过目录查询。通过这种技术可以实现所有引擎一致性工作,而且这个技术不仅可以跨引擎还可以跨VPLEX集群,而VPLEX集群可以跨区域,因此缓存一致性也可以跨区域部署。分布式缓存一致性技术使VPLEX相比传统的虚拟化方案拥有更高的性能和可靠性,并实现异地数据中心的虚拟化整合  对传统的虚拟化架构来说,如果虚拟化的I/O集群中有一个节点坏了,那么性能就会降低一半,而且实际情况降低不止一半。因为坏了一个节点,这个节点缓存一般会被写进去。因为没有缓存,操作会直接写到硬盘里。如果图中中心这个节点坏掉,那主机所有的可用性都没有了。而VPLEX如果有一个引擎或者一个控制器坏掉了,那这个引擎的负载会均摊到其他活动引擎上。这样总体来讲用户可以维持可预知性能,性能降低也不那么明显。

  用户在京东上下了一个订单,发现自己在京东的账户里面有余额,然后使用余额支付,支付成功之后,订单状态修改为支付成功,然后通知仓库发货。假设订单系统,支付系统,仓库系统是三个独立的应用,是独立部署的,系统之间通过远程服务调用。  订单的有三个状态:I:初始 P:已支付 W:已出库,订单金额100, 会员帐户余额200  如果整个流程比较顺利,正常情况下,订单的状态会变为I->P->W,会员帐户余额100,订单出库。    但是如果流程不顺利了?考虑以下几种情况  1:订单系统调用支付系统支付订单,支付成功,但是返回给订单系统数据超时,订单还是I(初始状态),但是此时会员帐户余额100,会员肯定会马上找京东骂京东,为啥不给老子发货,我都付钱了  2:订单系统调用支付系统成功,状态也已经更新成功,但是通知仓库发货失败,这个时候订单是P(已支付)状态,此时会员帐户余额是100,但是仓库不会发货。会员也要骂京东。  3:订单系统调用支付系统成功,状态也已经更新成功,然后通知仓库发货,仓库告诉订单系统,没有货了。这个时候数据状态和第二种情况一样。    对于问题一,我们来分析一下解决方案,能想到的解决方案如下  1 假设调用支付系统支付订单的时候先不扣钱,订单状态更新完成之后,在通知支付系统你扣钱  如果采用这种设计方案,那么在同一时刻,这个用户,又支付了另外一笔订单,订单价格200,顺利完成了整个订单支付流程,由于当前订单的状态已经变成了支付成功,但是实际用户已经没有钱支付了,这笔订单的状态就不一致了。即使用户在同一个时刻没有进行另外的订单支付行为,通知支付系统扣钱这个动作也有可能完不成,因为也有可能失败,反而增加了系统的复杂性。    2 订单系统自动发起重试,多重试几次,例如三次,直到扣款成功为止。  这个看起来也是不错的考虑,但是和解决方案一样,解决不了问题,还会带来新的问题,假设订单系统第一次调用支付系统成功,但是没有办法收到应答,订单系统又发起调用,完了,重复支付,一次订单支付了200。  假设支付系统正在发布,你重试多少次都一样,都会失败。这个时候用户在等待,你怎么处理?    3 在第二种方案的基础上,我们先解决订单的重复支付行为,我们需要在支付系统上对订单号进行控制,一笔订单如果已经支付成功,不能在进行支付。返回重复支付标识。那么订单系统根据返回的标识,更新订单状态。  接下来解决重试问题,我们假设应用上重试三次,如果三次都失败,先返回给用户提示支付结果未知。假设这个时候用户重新发起支付,订单系统调用支付系统,发现订单已经支付,那么继续下面的流程。如果会员没有发起支付,系统定时(一分钟一次)去核对订单状态,如果发现已经被支付,则继续后续的流程。    这种方案,用户体验非常差,告诉用户支付结果未知,用户一定会骂你,你丫咋回事情,我明明支付了,你告诉我未知。假设告诉用户支付失败,万一实际是成功的咋办。你告诉用户支付成功,万一支付失败咋办。    4 第三种方案能够解决订单和支付数据的一致性问题,但是用户体验非常差。当然这种情况比较可能是少数,可以牺牲这一部分的用户体验,我们还有没有更好的解决方案,既能照顾用户体验,又能够保证资金的安全性。  我们再回来看看第一种方案,我们先不扣钱,但是有木有办法让这一部分钱不让用户使用,对了,我们先把这一部分钱冻结起来,订单系统先调用支付系统成功的时候,支付系统先不扣钱,而是先把钱冻结起来,不让用户给其他订单支付,然后等订单系统把订单状态更新为支付成功的时候,再通知支付系统,你扣钱吧,这个时候支付系统扣钱,完成后续的操作。    看起来这个方案不错,我们仔细在分析一下流程,这个方案还存在什么问题,假设订单系统在调用支付系统冻结的时候,支付系统冻结成功,但是订单系统超时,这个时候返回给用户,告知用户支付失败,如果用户再次支付这笔订单,那么由于支付系统进行控制,告诉订单系统冻结成功,订单系统更新状态,然后通知支付系统,扣钱吧。如果这个时候通知失败,木有问题,反正钱都已经是冻结的了,用户不能用,我只要定时扫描订单和支付状态,进行扣钱而已。    那么如果变态的用户重新拍下来一笔订单,100块钱,对新的订单进行支付,这个时候由于先前那一笔订单的钱被冻结了,这个时候用户余额剩余100,冻结100,发现可用的余额足够,那就直接在对用户扣钱。这个时候余额剩余0,冻结100。先前那一笔怎么办,一个办法就是定时扫描,发现订单状态是初始的话,就对用户的支付余额进行解冻处理。这个时候用户的余额变成100,订单数据和支付数据又一致了。假设原先用户余额只有100,被冻结了,用户重新下单,支付的时候就失败了啊,的确会发生这一种情况,所以要尽可能的保证在第一次订单结果不明确的情况,尽早解冻用户余额,比如10秒之内。但是不管如何快速,总有数据不一致的时刻,这个是没有办法避免的。    第二种情况和第三种情况如何处理,下次在分析吧。  由于互联网目前越来越强调分布式架构,如果是交易类系统,面临的将会是分布式事务上的挑战。当然目前有很多开源的分布式事务产品,例如java JPA,但是这种解决方案的成本是非常高的,而且实现起来非常复杂,效率也比较低下。对于极端的情况:例如发布,故障的时候都是没有办法保证强一致性的。

前言 在系统开发过程中,经常遇到数据重复插入、重复更新、消息重发发送等等问题,因为应用系统的复杂逻辑以及网络交互存在的不确定性,会导致这一重复现象,但是有些逻辑是需要有幂等特性的,否则造成的后果会比较严重,例如订单重复创建,这时候带来的问题可是非同一般啊。 什么是系统的幂等性 幂等是数据中得一个概念,表示N次变换和1次变换的结果相同。 高并发的系统如何保证幂等性? 1.查询 查询的API,可以说是天然的幂等性,因为你查询一次和查询两次,对于系统来讲,没有任何数据的变更,所以,查询一次和查询多次一样的。 2.MVCC方案 多版本并发控制,update with condition,更新带条件,这也是在系统设计的时候,合理的选择乐观锁,通过version或者其他条件,来做乐观锁,这样保证更新及时在并发的情况下,也不会有太大的问题。 例如:update table_xxx set name=#name#,version=version+1 where version=#version# ,或者是 update table_xxx set quality=quality-#subQuality# where quality-#subQuality# >= 0 。 3.单独的去重表 如果涉及到的去重的地方特别多,例如ERP系统中有各种各样的业务单据,每一种业务单据都需要去重,这时候,可以单独搞一张去重表,在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。 4.分布式锁 还是拿插入数据的例子,如果是分布是系统,构建唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统,在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路。 5.删除数据 删除数据,仅仅第一次删除是真正的操作数据,第二次甚至第三次删除,直接返回成功,这样保证了幂等。 6.插入数据的唯一索引 插入数据的唯一性,可以通过业务主键来进行约束,例如一个特定的业务场景,三个字段肯定确定唯一性,那么,可以在数据库表添加唯一索引来进行标示。 这里有一个场景,API层面的幂等,例如提交数据,如何控制重复提交,这里可以在提交数据的form表单或者客户端软件,增加一个唯一标示,然后服务端,根据这个UUID来进行去重,这样就能比较好的做到API层面的唯一标识。 7.状态机幂等 在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机,就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。 以上就是高并发系统数据幂等的解决方案的资料整理,后续继续补充相关知识,谢谢大家对本站的支持!


孩子不长个怎么办?十一岁孩子多高算正常?
补钙,多吃些水果,有营养的东西,差不多十一岁一米四,我妹妹现在七岁就有一米三了

关于身高问题,我是女的!!请各位帮助
而且从小时候到现在我都没有什么身高的猛增期,一直是很匀很匀的慢慢长...这又是怎么回事?哦,我是早产,是不是先天就有点发育不足啊? 有没有什么具体的运动和饮食的安排,能让我在这个暑假再长一点高呢? 游泳怎么样? 我有没有希望长到160以上啊!我是女生,父亲170,母亲153。现在在练跆拳道~回答:...

山东青岛人,十一长假去云南昆明大理丽江。会有高原反应吗??玉龙雪山...
这里需要提醒的是,高原反应并不是可以通过反复锻炼就可以克服的。所以,为了保证身体健康,建议高原反应易发者不要继续登达这么高的地区,在低海拔地区健身登山一样能陶冶情操和锻炼身体。一、患下列疾病者不宜进入高原 初次高原之前,一定要进行严格的体格检查,如发现心、肺、脑、肝、肾的病变,严重贫血或高血压病人,...

十一岁男孩标准身高是多少?
3. 体育锻炼与营养 为了维持健康的体重和身高,鼓励孩子参与体育锻炼,并保证他们摄入均衡的营养,特别是钙、铁、锌等微量元素和维生素。4. 偏离标准的处理 如果孩子的体重超过标准体重的20%,可能被归类为过重,这可能是肥胖的迹象。相反,如果体重低于标准体重的20%,则可能被归类为过轻,这可能是营养...

免费是从上高速还是下高速算 十一高速免费时间怎么算
国庆节高速免费是从下高速算的。以下两种情况需要注意:1、当在收费期间上高速,下高速为免费期间时,不收费。2、当在免费期间上高速,下高速为收费期间时,收费。免费时段从节假日第一天00:00开始,最后一天24:00结束。其中,普通公路以车辆通过收费站收费车道的时间为准,高速公路以车辆驶离出口收费...

十一运夺金怎么定准一个胆,谢谢高手指教
玩转山东十一运夺金的技巧,绝不仅是选号技巧,更多的实战经验。爱彩票网推出的山东11选5目前有12种玩法,可谓千变万化,其乐无穷。俗话说,不管白猫黑猫,抓得老鼠就是好猫,本次笔者将篇幅主要集中于任选五的胆码分析,其他几种玩法的胆码选择类似。 所谓 玩转山东“十一运夺金”的技巧,绝不仅是选号...

十一火车票今起开抢,怎么抢票成功率高?
现在已经9月份了,距离十一黄金周只有不到一个月的时间了,作为一年中的小长假,很多人早已计划好出游,而今日十一火车票正式开抢,那么你知道怎么抢票成功率高吗?下面给大家介绍几个小窍门。现在已经9月份了,距离十一黄金周只有不到一个月的时间了,作为一年中的小长假,很多人早已计划好出游,而今日...

长春市十一高怎么样?
首先,长春市十一高中拥有优秀的教学团队。学校聚集了一批经验丰富、教育教学方法先进、富有创新精神的教师团队。他们致力于为学生提供高质量的教育,并注重培养学生的综合素质和个性发展。这样的教师团队保证了学生能够接受到全面的知识教育。其次,学校的教学设施先进,为学生提供了良好的学习环境。校园内配备了...

高层住宅常见的11、18、26、33层是如何确定的?
做过实验,消防员全副武装快速爬 上不到十层,其体力已经无法保证立即投入灭火战斗。故超过若干层后即要设消防电梯,以保障消防员的体力。而普通消防云梯车的高度有限,所以一部普通电梯+ 一部楼梯的最高层数11层也确定下来。否则建筑着起火来,消防员根本爬不上去了。再看一般的云梯车高度是50米左右(...

我现在十一岁,身高1.6米,爸爸1.8m,妈妈,1.62m 长大后会多高?(男生 )
1.孩子身高和父母身高的计算公式为:儿子成年身高(cm)=(父亲身高+母亲身高)×1.08\/2 女儿成年身高(cm)=(父亲身高×0.923+母亲身高)\/2 2.所以父亲身高180,母亲身高162,可预计:儿子成年身高(cm)=(180+162)×1.08\/2= 185.76 女儿成年身高(cm)=(180×0.923+162)\/2=164.07 3....

蒲江县18843694517: 双十一是怎么保证高并发,分布式系统中,数据一致性 -
针志新青: 前言 在系统开发过程中,经常遇到数据重复插入、重复更新、消息重发发送等等问题,因为应用系统的复杂逻辑以及网络交互存在的不确定性,会导致这一重复现象,但是有些逻辑是需要有幂等特性的,否则造成的后果会比较严重,例如订单重...

蒲江县18843694517: 天猫双十一是怎么保证高并发、分布式系统中,数据一致性的? -
针志新青: 今年交易库应该使用的还是全程参与过的Oceanbase0.5版,还可以回答一下 1. 数据一致性的保证,这是个分布式问题,解决方法就是就是Paxos协议.Oceanbase的updateserver节点由一个master和两个slave组成,每条redolog都要保证写...

蒲江县18843694517: 如何评价2015年双十一淘宝网出现频繁的服务器繁忙相关提示 -
针志新青: 高并发系统的过载保护策略,后端处理的能力必然也是有限的, 面对史无前例的这种例DDoS攻击 请求, 为了保证后端系统的可用性,采用有损服务/降级服务,牺牲一部分用户的体验,也是一种手段.

蒲江县18843694517: 如何解决分布式开发中的抢锁并发现象 -
针志新青: 前言在系统开发过程中,经常遇到数据重复插入、重复更新、消息重发发送等等问题,因为应用系统的复杂逻辑以及网络交互存在的不确定性,会导致这一重复现象,但是有些逻辑是需要有幂等特性的,否则造成的后果会比较严重,...

蒲江县18843694517: 今年“双11”的快递为什么那么快 -
针志新青: 在双十一的快递中,各家快递单位为了保证时节间,他们会采取加的,就是说尽量组织快递运输车加班(多跑些来回),并且还会多组织快递运输(增加运输车). 再就是今年双11并不火爆,很多退单的

蒲江县18843694517: 如何在高并发分布式系统中生成全局唯一Id -
针志新青: 1. c# 中的 Guid 就是唯一的,它保证对在同一时空中的所有机器都是唯一的.据我所知,它也会产生碰撞,但是概率极小,完全可以不用理会的小.2. 可以用现有的支持原子操作的分布式数据库,例:Redis 很多网站用Redis 的原子性来生成唯一标识符3. 我们可以用本机的Mac地址,硬盘序列号,本地最大标识符来拼接出唯一.Mac 可被修改,硬盘序列号也有可能不唯一,但是这三样拼接在一起,碰撞的概率很小的 Md5 也会碰撞,不是么?

蒲江县18843694517: 现在的阿里巴巴采用哪种数据库 -
针志新青: 据说是mysql 做分布式,有弹性

蒲江县18843694517: 大规模,高并发网站开发经验都有哪些 -
针志新青: 高并发量网站解决方案一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经...

蒲江县18843694517: 只通过java代码,保证并发量过万的方法有哪些 -
针志新青: 另外一个回复是简单的建议,限于代码层面跟计算资源紧张的情况.说说我的理论:1、想要这么大的并发量,申请买几台比较好的机器,带宽加到足够大应该不是问题.2、网络层的负载均衡考虑一下,这应该也不是啥问题,这么大并发量,...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网