决战梭哈棋牌APP下载_决战梭哈棋牌官网 - 由决战梭哈棋牌APP下载,决战梭哈棋牌官网社主办的《决战梭哈棋牌APP下载,决战梭哈棋牌官网》是我国消费领域中一张全国性、全方位、大容量的综合性日报。其立足消费网投领域,依托轻工行业,面向城乡市场,最先发布相关的专业权威资讯。

保证分布式系统数据一致性的6种方案

  • 时间:
  • 浏览:1

对于业务部门来说,电商部门的订单支付,时需调用

1.支付平台的支付接口来处置订单;

2.一块儿时需调用积分中心的接口,按照业务规则,给用户增加积分。

三、去哪儿网方案

哪儿网分布式事务方案

随着业务规模不断地扩大,电商网站一般都是面临拆分之路。也不将从前另1个 单体应用拆分成多个不同职责的子系统。比如就让原应将面向用户、客户和运营的功能都放在另1个 系统里,现在拆分为订单中心、代理商管理、运营系统、报价中心、库存管理等多个子系统。

什么都在拆分大的流程为多个小的本地事务的前提下,对于非实时、非强一致性的关联业务写入,在本地事务执行成功后,我们歌词 儿取舍发消息通知、关联事务异步化执行的方案。

更多分布式事务参考内容:

http://www.roncoo.com/article/index?title=%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1

二、eBay 模式

经典方案 - eBay 模式

此方案的核心是将时需分布式处置的任务通过消息日志的法子来异步执行。消息日志可不时需存储到本地文本、数据库或消息队列,再通过业务规则自动或人工发起重试。人工重试更多的是应用于支付场景,通过对账系统对事后现象的处置。

核心型态

传统关系型数据库的事务模型时需遵守 ACID 原则。在单数据库模式下,ACID 模型能有效保障数据的完整性性,就让在大规模分布式环境下,另1个 业务往往会跨太少个数据库,怎样才能保证这多个数据库之间的数据一致性,时需这一行之有效的策略。在 JavaEE 规范中使用 2PC (2 Phase Commit, 两阶段提交) 来处置跨 DB 环境下的事务现象,就让 2PC 是反可伸缩模式,也也不说,在事务处置过程中,参与者时需时不时持有资源直到整个分布式事务结束英文。从前,当业务规模达到千万级以上时,2PC 的局限性就很难 明显,系统可伸缩性会变得很差。基于此,我们歌词 儿采用 BASE 的思想实现了一套这一 2PC 的分布式事务方案,这也不 DTS。DTS在充分保障分布式环境下高可用性、高可靠性的一块儿兼顾数据一致性的要求,其最大的特点是保证数据最终一致 (Eventually consistent)。

协议简单:DTS 定义了这一 2PC 的标准两阶段接口,业务系统只时需实现对应的接口就可不时需使用 DTS 的事务功能。

对 b 场景做另1个 特殊说明:比如 B 是扣库存服务,在第一次调用的就让原应并不是生活原应失败了,就让重试的就让库存原应变为 0,无法重试成功,这一就让很难 回滚 A 和 C 了。

很难 原应人们虽然在业务库的同实例里放消息库或事务记录库,会对业务侵入,业务时需关心这一库,不是另1个 合理的设计?

与 RPC 服务协议无关:在 SOA 架构下,另1个 或多个 DB 操作往往被包装成另1个 另1个 的 Service,Service 与 Service 之间通过 RPC 协议通信。DTS 框架构建在 SOA 架构上,与底层协议无关。

很难 最终决定有并不是生活法子,根据具体场景:

方案选型

服务依赖太少,会带来管理繁复性增加和稳定性风险增大的现象。试想原应我们歌词 儿强依赖 10 个服务,9 个都执行成功了,最后另1个 执行失败了,很难 是都是前面 9 个都是回滚掉?这一成本还是非常高的。

原应 ACID 为分区的数据库提供一致性的取舍,很难 怎样才能实现可用性呢?答案是

BASE (basically available, soft state, eventually consistent)

BASE 的可用性是通过支持局部故障而都是系统全局故障来实现的。下面是另1个 简单的例子:原应将用户分区在 5 个数据库服务器上,BASE 设计鼓励这一的处置法子,另1个 用户数据库的故障只影响这台特定主机那 20% 的用户。这里不涉及任何魔法,不过它虽然可不时需带来更高的可感知的系统可用性。

参考资料

Base: An Acid Alternative (eBay 方案)

In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

英文版 : http://queue.acm.org/detail.cfm?id=1394128

中文版: http://article.yeeyan.org/view/167444/125572

分布式事务服务 (DTS)

https://www.cloud.alipay.com/docs/middleware/xts/index.html出处:http://blog.csdn.net/zheng0518/article/details/51194942

简单的说,DTS 框架有如下型态:

最终一致:事务处置过程中,会有短暂不一致的具体情况,但通过恢复系统,可不时需让事务的数据达到最终一致的目标。

但拆分就让就不同了,不同的子系统都是我本人的存储。比如订单中心就只管理我本人的订单库,而库存管理都是我本人的库。很难 运营系统撤出 订单的就让也不通过接口调用等法子来调用订单中心和库存管理的服务了,而都是直接去操作库。这就涉及另1个 『分布式事务』的现象。



分布式事务有并不是生活处置法子

1.优先使用异步消息。

上文原应说过,使用异步消息 Consumer 端时需实现幂等。 幂等有并不是生活法子,并不是生活法子是业务逻辑保证幂等。比如接到支付成功的消息订单具体情况变成支付完成,原应当前具体情况是支付完成,则再收到另1个 支付成功的消息则说明消息重复了,直接作为消息成功处置。

eBay 法子的主要思路如下。

Base:并不是生活 Acid 的替代方案

此方案是 eBay 的架构师 Dan Pritchett 在 30008 年发表给 ACM 的文章,是一篇解释 BASE 原则,原应说最终一致性的经典文章。文中讨论了 BASE 与 ACID 原则在保证数据一致性的基本差异。

我们歌词 儿采用异步消息通知机制,目前主要使用 ActiveMQ,基于 Virtual Topic 的订阅法子,保证单个业务集群订阅的单次消费。



总结 分布式服务对衍生的配套系统要求比较多,特别是我们歌词 儿基于消息、日志的最终一致性方案,时需考虑消息的积压、消费具体情况、监控、报警等。

一、规避分布式事务

规避分布式事务——业务整合

业务整合方案主要采用将接口整合到本地执行的法子。拿现象场景来说,则可不时需将服务 A、B、C 整合为另1个 服务 D 给业务,这一服务 D 再通过转换为本地事务的法子,比如服务 D 所含本地服务和服务 E,而服务 E 是本地服务 A ~ C 的整合。

我们歌词 儿采用的法子是同步调用,首先处置本地事务业务。考虑到积分业务比较单一且业务影响低于支付,由积分平台提供增加与回撤接口。

在分布式系统来说,原应让你牺牲一致性,CAP 理论别问我们歌词 儿很难 放弃可用性,这显然很难 接受。为了便于讨论现象,先简单介绍下数据一致性的基础理论。

实际上可不时需依靠运维的手段来繁复开发的侵入,我们歌词 儿的法子是让 DBA 在公司所有 MySQL 实例上预初始化这一库,通过框架层(消息的客户端或事务 RPC 框架)透明的在身前操作这一库,业务开发人员只时需关心我本人的业务逻辑,不时需直接访问这一库。

最终一致性

弱一致性的特定形式。系统保证在很难 后续更新的前提下,系统最终返回上一次更新操作的值。在很难 故障存在的前提下,不一致窗口的时间主要受通信延迟,系统负载和基因重组副本的个数影响。DNS 是另1个 典型的最终一致性系统。

优点: 处置(规避)了分布式事务。

缺点: 显而易见,把从前规划拆分好的业务,又耦合到了一块儿,业务职责不清晰,不促使维护。

原应这一法子存在明显缺点,通常不建议使用。

拆分首很难面临的是哪些地方呢?

最结束英文的单体应用所有功能都是一块儿,存储也在一块儿。比如运营要撤出 某个订单,那直接去更新订单表具体情况,就让更新库存表就 ok 了。原应是单体应用,库在一块儿,哪些地方地方都可不时需在另1个 事务里,由关系数据库来保证一致性。

消息日志方案的核心是保证服务接口的幂等性。

考虑到网络通讯失败、数据丢包等原应,原应接口很难 保证幂等性,数据的唯一性将很难保证。

我们歌词 儿在交易创建流程中,首先创建另1个 不可见订单,就让在同步调用锁券和扣减库存时,针对调用异常(失败原应超时),发出废单消息到MQ。原应消息发送失败,本地会做时间阶梯式的异步重试;优惠券系统和库存系统收到消息后,会进行判断不是时需做业务回滚,从前就准实时地保证了多个本地事务的最终一致性。

五、支付宝方案支付宝及蚂蚁金融云的分布式服务 DTS 方案

六、农信网方案

农信网数据一致性方案

1.电商业务

公司的支付部门,通过接入其它第三方支付系统来提供支付服务给业务部门,支付服务是另1个 基于 Dubbo 的 RPC 服务。

在工程实践上,为了保障系统的可用性,互联网系统大多将强一致性需求转加在最终一致性的需求,并通过系统执行幂等性的保证,保证数据的最终一致性。但在电商等场景中,对于数据一致性的处置法子和常见的互联网系统(如 MySQL 主从同步)又有一定区别,群友的讨论分成以下 6 种处置方案。

要保证多个系统间数据一致,乍一看,时需要引入分布式事务框架还都可否处置。但引入非常重的这一二阶段提交分布式事务框架会带来繁复性的急剧上升;在电商领域,绝对的强一致是过于理想化的,我们歌词 儿可不时需取舍准实时的最终一致性。

具体业务场景如下,比如另1个 业务操作,原应一块儿调用服务 A、B、C,时需满足要么一块儿成功;要么一块儿失败。A、B、C 原应是多个不同部门开发、部署在不同服务器上的远程服务。

与底层事务实现无关: DTS 是另1个 抽象的基于 Service 层的概念,与底层事务实现无关,也也不说在 DTS 的范围内,无论是关系型数据库 MySQL,Oracle,还是 KV 存储 MemCache,原应列存数据库 HBase,只要将对其的操作包装成 DTS 的参与者,就可不时需接入到 DTS 事务范围内。

以下是分布式事务框架的流程图



实现

另1个 完整性的业务活动由另1个 主业务服务与若干从业务服务组成。

主业务服务负责发起并完成整个业务活动。

从业务服务提供 TCC 型业务操作。

业务活动管理器控制业务活动的一致性,它登记业务活动中的操作,并在活动提交时确认所有的两阶段事务的 confirm 操作,在业务活动撤出 时调用所有两阶段事务的 cancel 操作。”

从业务规则上时需一块儿保证业务数据的实时性和一致性,也也不支付成功时需加积分。

面临的现象

每个功能点的实现都原应会依赖内外部服务。很难 怎样才能保证各个服务之间的数据是一致的呢?比如锁定优惠券服务调用超时了,很难 取舍到底有很难 锁券成功,该怎样才能处置?再比如锁券成功了,就让扣减库存失败了,该怎样才能处置?

在第二阶段,分别读出消息队列(但不删除),通过判断更新记录表 updates_applied 来检测相关记录不是被执行,未被执行的记录会修改 user 表,就让增加一根操作记录到 updates_applied,事务执行成功就让再删除队列。

消息通知往往很难 保证 3000% 成功;且消息通知后,接收方业务不是能执行成功还是未知数。前者现象可不时需通过重试处置;后者可不时需取舍事务消息来保证。

就让事务消息框架并不是生活会给业务代码带来侵入性和繁复性,什么都我们歌词 儿取舍基于 DB 事件变化通知到 MQ 的法子做系统间解耦,通过订阅方消费 MQ 消息时的 ACK 机制,保证消息一定消费成功,达到最终一致性。原应消息原应会被重发,消息订阅方业务逻辑处置要做好幂等保证。

与 2PC 协议比较

-很难 单独的 Prepare 阶段,降低协议成本 -系统故障容忍度高,恢复简单

文章中描述了另1个 最常见的场景,原应产生了一笔交易,时需在交易表增加记录,一块儿时需修改用户表的金额。这另1个 表属于不同的远程服务,什么都就涉及到分布式事务一致性的现象。



文中提出了另1个 经典的处置法子,将主要修改操作以及更新用户表的消息放在另1个 本地事务来完成。一块儿为了处置重复消费用户表消息带来的现象,达到多次重试的幂等性,增加另1个 更新记录表 updates_applied 来记录原应处置过的消息。



系统的执行伪代码如下



基于以上法子,在第一阶段,通过本地的数据库的事务保障,增加了 transaction 表及消息队列 。

什么都目前只剩下时需实时同步做、有强一致性要求的业务场景了。在交易创建过程中,锁券和扣减库存是从前的另1个 典型场景。

四、蘑菇街方案

蘑菇街交易创建过程中的分布式一致性方案

交易创建的一般性流程



我们歌词 儿把交易创建流程抽象出一系列可扩展的功能点,每个功能点都可不时需有多个实现(具体的实现之间有组合/互斥关系)。把各个功能点按照一定流程串起来,就完成了交易创建的过程。

弱一致性

系统我太少 保证续多线程 原应线程 的访问都是返回最新的更新过的值。系统在数据写入成功就让,不承诺立即可不时需读到最新写入的值,也不会具体的承诺多久就让可不时需读到。

另外并不是生活法子原应业务逻辑无法保证幂等,则要增加另1个 去重表原应这一的实现。对于 producer 端在业务数据库的同实例放在另1个 消息库,发消息和业务操作在同另1个 本地事务里。发消息的就让消息我太少 立即发出,也不向消息库插入一根消息记录,就让在事务提交的就让再异步将消息发出,发送消息原应成功则将消息库里的消息删除,原应遇到消息队列服务异常或网络现象,消息很难 成功发出很难 消息就留在这里了,会有另外另1个 服务不断地将哪些地方地方消息扫出重新发送。

总结起来,虽然并不是生活法子的根本原理是这一的,也也不将分布式事务转换为多个本地事务,就让依靠重试等法子达到最终一致性。

比如 A 同步调用 B,C。A 本地事务成功的就让更新本地事务记录具体情况,B 和 C 同样。原应有一次 A 调用 B 失败了,这一失败原应是 B 真的失败了,也原应是调用超时,实际 B 成功。则由另1个 中心服务对比三方的事务记录表,做另1个 最终决定。假设现在三方的事务记录是 A 成功,B 失败,C 成功。

通过以上法子,达到了分布式系统的最终一致性。进一步了解 eBay 的方案可不时需参考文末链接。

分布式事务服务简介

分布式事务服务 (Distributed Transaction Service, DTS) 是另1个 分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。DTS 从架构上分为 xts-client 和 xts-server 两每种,前者是另1个 嵌入客户端应用的 JAR 包,主要负责事务数据的写入和处置;后者是另1个 独立的系统,主要负责异常事务的恢复。

强一致

当更新操作完成就让,任何多个后续多线程 原应线程 的访问都是返回最新的更新过的值。这一是对用户最友好的,也不用户上一次写哪些地方,下一次就保证能读到哪些地方。根据 CAP 理论,这一实现时需牺牲可用性。

2.使用事务记录库

2.有的业务不适合异步消息的法子,事务的各个参与方都时需同步的得到结果。这一具体情况的实现法子虽然和上端这一,每个参与方的本地业务库的同实例上端放另1个 事务记录库。

在电商等业务中,系统一般由多个独立的服务组成,怎样才能处置分布式调用就让数据的一致性?

具体的流程是先调用积分平台增加用户积分,再调用支付平台进行支付处置,原应处置失败,catch 法子调用积分平台的回撤法子,将本次处置的积分订单回撤。



2.用户信息变更

公司的用户信息,统一由用户中心维护,而用户信息的变更时需同步给各业务子系统,业务子系统再根据变更内容,处置本人业务。用户中心作为 MQ 的 producer,加在通知给 MQ。APP Server 订阅该消息,同步本地数据信息,再处置相关业务比如 APP 退出下线等。