数据一致性-对账

简介: 一致性分为强一致性和弱一致性。强一致性的协议和手段主要有:二阶段提交(2PC)、三阶段提交(3PC)、TCC(Try-Confirm-Cancel)补偿型。这里面经常有人把两阶段提交和TCC补偿型混淆。二阶段提交实际上业务逻辑是在提交之前做的,两阶段只是事务控制的两个阶段。而TCC是将业务逻辑分为try、confirm和cancel三个阶段。举个例子:比如一个人要预售苹果,有两种销售策略。一种让用户先付钱,根据用户需求量准备足够的苹果。另一种是让用户先付钱同时声明到时候先到先得,没抢到的就退款。第一种就是二阶段提交,第二种就是TCC。弱一致性在分布式系统中常用的是一种特例:最终一致性。

引子


妈妈要我的时候已经40岁了。她一定是下了很大的决定才决定终究还是想要个女孩,希望这个女孩可以解救她的孤独。上高三的时候,有次又是因为哥哥的事情,妈妈把我从学校接回家。一个劲儿的问我怎么办好。在我能和她一起思考前的50多年里,她该是多么无助。所以当我不断看自己的掌纹,上面的起起伏伏。在想这一切解释不通的苦难什么时候过去。在想是不是在天堂的妈妈安排了这一切,因为理解她的痛苦是我的使命。我错了,她不是在天堂安排了这一切,是在我很小的时候。我为理解她而生,这是我的命运。命运并不是很深奥的东西,只是一个发展脉络。好比做金融领域,和清算、结算、对账打交道就是命运。对账本来用在金融领域,逐渐扩大到数据一致性领域。好比弹性工程,本来是航天领域的术语。逐渐演变为构造高可用工程的方法,方法的核心是通过提出边界场景(失败、风险、意外事件)问题,然后从检测、补救、预防几个维度去思考答案,最终反哺到系统设计开发与流程改善上,倒逼架构和流程SOP改进,再结合预案演练达到扼杀故障和缩短故障时间的目的。


概念


一致性分为强一致性和弱一致性。


强一致性的协议和手段主要有:二阶段提交(2PC)、三阶段提交(3PC)、TCC(Try-Confirm-Cancel)补偿型。这里面经常有人把两阶段提交和TCC补偿型混淆。二阶段提交实际上业务逻辑是在提交之前做的,两阶段只是事务控制的两个阶段。而TCC是将业务逻辑分为try、confirm和cancel三个阶段。举个例子:比如一个人要预售苹果,有两种销售策略。一种让用户先付钱,根据用户需求量准备足够的苹果。另一种是让用户先付钱同时声明到时候先到先得,没抢到的就退款。第一种就是二阶段提交,第二种就是TCC。弱一致性在分布式系统中常用的是一种特例:最终一致性。在工作中,最终一致性通常通过补单和对账来解决。补单主要指在运行时同时检查返回值,如果返回值为失败,会重新处理(补单处理)。


对账主要分为两个阶段:数据核对和差错处理。数据核对就是对账中的轧账。注意「轧」这里念「ga」二声。差错处理就是对账中的平账。


1112728-20191024123336294-1915608966.png


应用


以秒杀场景为例说明一下对账的常用流程。


对账依据和标准


对账问题最先解决的问题是对账依据和标准。比如秒杀场景,对账依据就是订单号,整个链路采用唯一内部订单号。对账标准可以设定为对用户的承诺。就是说:一次秒杀活动结束,如果给用户的结果是成功,那么实际上超卖了,那就自己补货解决。如果给用户结果是失败了,实际上有很多没卖出去,那就是没卖出去放着。总之,我承诺给用户的结果一定要履行。如果数据核对时,各个环节结果不一致,最终结果向用户的承诺对齐。


对账梳理


可以从明细和总数两个方面来做对账。在秒杀场景中,明细是一条条请求订单。总数是成功和失败了多少个请求,买出多少库存。明细对账主要用于定位问题。总数对账是兜底策略,用来解决「怎么证明自己是对的」的问题。


对账时机


分为在线对账和离线对账。在线对账又分为实时对账和准实时对账。实时对账就是比如秒杀成功了,那下游的每一步都需要是成功的,其他情况如超时等则采用重试来进行强一致性保证。准实时对账通常用异步来实现。在秒杀的场景,如果订单返回失败,可以异步发起一个任务进行退款,如果退款不成功则可以用多次重试进行补单。


离线对账就是平时所说的定时任务。这个对账方法就比较多了,自由发挥空间比较大。特别是在轧账场景中,因为不实际修改数据,风险低,很多新技术试用可以选择在此模块进行。

相关文章
|
6天前
|
分布式数据库 数据库
数据同步并发控制与数据一致性
数据同步并发控制与数据一致性
23 3
|
7月前
|
消息中间件 缓存 监控
订单系统的优化
订单系统的优化
|
6天前
|
NoSQL Java 关系型数据库
秒杀场景下如何保证数据一致性?就这个问题我给出了最详细的方案
本文主要讨论秒杀场景的解决方案。 什么是秒杀? 从字面意思理解,所谓秒杀,就是在极短时间内,大量的请求涌入,处理不当时容易出现服务崩溃或数据不一致等问题的高并发场景。 常见的秒杀场景有淘宝双十一、网约车司机抢单、12306抢票等等。
|
6天前
|
监控 供应链 数据库
数据对账
统标识(System Identifiers)**:用于区分数据来源,确保知道数据来自哪个系统。
33 11
|
6天前
|
缓存 Java API
数据一致性
数据一致性
35 1
|
9月前
|
网络架构
系统可用性理解
开发一个软件系统,对其要求越来越高,如果你了解一些「架构设计」的要求,就知道一个好的软件架构应该遵循以下 3 个原则: 1. 高性能 2. 高可用 3. 易扩展
219 1
|
缓存 JSON NoSQL
对账系统设计和架构
对账系统设计和架构
664 0
|
消息中间件 缓存 网络协议
如何通过事务消息保障抢购业务的分布式一致性?
作者:山猎,阿里云解决方案架构师
178 0
如何通过事务消息保障抢购业务的分布式一致性?
|
存储 监控 中间件
海量数据写入——万级并发的订单系统如何分库?
一定要分表分库吗? 当然不一定。 虽然很多互联网公司的体量很大、用户非常多,但你千万不要被这些现象迷惑了。实际上,90% 以上的系统能够发展到上百万、上千万数据量已经很不错了。对于千万的数据量,开源的 MySQL 都可以很好地应对,更别说一些商业数据库了。 另外,当数据增长到一定量级后,可以在业务层面做一些处理。比如根据业务特点,对无效数据、软删除数据,以及业务上不会再查询的数据进行统一归档,这也是一个成本低、效果明显的方式了。
|
安全 前端开发
聊聊对账
聊聊对账
381 0
聊聊对账