数据一致性-对账

简介: 一致性分为强一致性和弱一致性。强一致性的协议和手段主要有:二阶段提交(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


应用


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


对账依据和标准


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


对账梳理


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


对账时机


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


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

相关文章
|
消息中间件 缓存 NoSQL
谈谈高并发系统的设计方法论
设计 `高并发` 系统,就是要让该系统保证它 `整体可用` 的同时,能够尽可能多的 `处理很高的并发用户请求`,能够 `承受很大的负载流量冲击`。
1792 6
|
网络性能优化
基于MQTT.fx的ESP8266主题发布订阅
本篇文章主要以ESP8266-12E作为开发板,带你了解MQTT发布、订阅、取消订阅的基础知识。
717 0
基于MQTT.fx的ESP8266主题发布订阅
|
2月前
|
运维 Kubernetes Linux
零基础用AI管理k8s集群:OpenClaw(Clawdbot)保姆级部署(阿里云/Win11/Mac/Linux)+K8s技能集成+FAQ
在AIOps领域,自动化集群管理是核心痛点——传统运维依赖手动执行kubectl命令、排查网络与权限问题,效率低下且易出错。2026年,开源AI代理框架OpenClaw(Clawdbot)凭借Kubernetes Skills的集成能力,实现了“自然语言驱动k8s集群管理”,无需复杂脚本,仅需口语化指令即可完成健康巡检、资源交付、故障排查等运维工作。
735 5
|
消息中间件 机器学习/深度学习 关系型数据库
|
3月前
|
人工智能 监控 安全
“专家:未来一周只需工作 2 天”?1分钟阿里云部署OpenClaw(Clawdbot) AI助理,24小时替你扛下重复性工作
在AI智能体全面落地的2026年,“高效办公”早已不是口号,而是触手可及的现实。近期有行业专家公开表示:“未来一周只需工作2天,核心秘诀就是借助AI助理承接所有重复性、机械性工作,人类专注于创意与决策即可”。而OpenClaw(前身为Clawdbot、Moltbot)作为当前最热门的开源AI代理工具,正是实现这一目标的关键——它能24小时不间断运行,自动完成文档处理、日程管理、数据整合、跨工具协同等各类繁琐工作,而阿里云为其量身打造的一键部署方案,更是将部署门槛拉至最低,零基础新手仅需1分钟即可完成配置,真正实现“部署即能用,用了就省力”。
740 2
|
9月前
|
存储 缓存 中间件
《金融对账系统雪崩隐患的深度复盘与架构重生》
本文复盘了金融级支付对账系统因分布式缓存设计缺陷引发的隐性危机:系统上线后,对账高峰时段出现节点“假死”、数据不一致问题,却无明显资源耗尽迹象,且问题间歇性发生。排查发现,高并发下任务调度框架返回异常商户ID,生成无效缓存Key,叠加缓存客户端“批量合并请求”与“无限重试”设计,导致线程池阻塞;节点恢复后又因任务状态未同步,引发数据重复处理或遗漏。通过全链路数据校验、缓存交互优化(分段查询+降级熔断)、分布式锁与全局状态同步,系统问题得以解决,最终提炼出分布式系统开发的四大核心原则,为后端架构设计提供参考。
352 33
|
9月前
|
SQL 关系型数据库 MySQL
explain的type几种类型详解
在 MySQL 中,使用 EXPLAIN(或 EXPLAIN SELECT ...)可以查看 SQL 语句的执行计划,而其中最重要的字段之一就是 type。它表示 MySQL 在执行查询时访问数据表的方式(即访问类型),也叫做 连接类型(Join Type)。
|
数据采集 存储 供应链
数据对账的目的是什么?
数据对账的目的是什么?
822 2

热门文章

最新文章