数据一致性检测的应用场景与最佳实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 随着业务规模的扩张,企业系统变得越来越复杂,在这种复杂的分布式系统架构下,难免会出现远程调用失败,消息发送失败,并发 bug 等等问题,这些问题最终会导致系统间的数据不一致,导致用户体验受损,用户利益受损,对平台来说就是产生资损。

随着业务规模的扩张,企业系统变得越来越复杂,在这种复杂的分布式系统架构下,难免会出现远程调用失败,消息发送失败,并发 bug 等等问题,这些问题最终会导致系统间的数据不一致,导致用户体验受损,用户利益受损,对平台来说就是产生资损。因此如何持续保障系统的业务稳定性对于企业来说是一个很重要的课题,本文旨在介绍一些常见业务应用场景下的业务数据一致性保障最佳实践。

离线or在线,事前or事后

应对业务数据不一致问题的常规操作是,配置定时任务,在每个固定时间点去拉取历史一段时间的数据出来进行比对,判断是否有数据故障出现,比如利用hadoop做一些批处理MapReduce作业,这种离线计算的方式时效性比较差,对于电商系统或者对于实时性要求较高的系统来说,问题发现的越晚损失也就越大,所以我们需要一种在线的校验模式来实时发现数据不一致问题。

在线的校验模式指的是每出现一笔数据就进行一次比对,这种比对方式还可以分为事前和事后比对。

  • 事前比对是一种业务强耦合的校验方式,我们在业务系统代码中进行类似 AOP 的操作,横插一段校验代码,如果校验发现问题,则阻断这次业务操作,这种模式虽然时效性很高,能够保证每一笔数据的正确性,但是因为和业务耦合的太重,很容易出现一些灾难性的问题,比如校验代码的性能差或者异常处理不正确,会直接导致业务操作受阻,影响正常业务活动。
  • 事后校验严格上来说不能算是实时校验,因为校验的时间点滞后于真实的业务动作发生时间点,这算是一种准实时校验,这种校验的好处在于,可以和业务解耦,不阻断业务的正常进行,还能较为"实时"的发现数据不一致问题,并且在一些特殊场景下(比如异步业务,下面会介绍)只能使用事后校验,缺点也很明显,就是时效性相比于事前校验来说会比较差。

这里在啰嗦一句,可能读到这里,有些人会问,既然是业务动作发生之后再进行校验,它的意义还有多大呢?的确相比于事前校验来说,他并不能保证每一笔数据都正确,但是在实际操作中,像电商这种场景下,我们进行业务功能迭代,会经过日常环境 -> 预发环境 -> Beta测试 -> 线上环境的流程,尤其是在预发环境和 Beta 测试的情况下,一般会进行一些线上引流或者模拟数据测试,特点是量小,即使发生问题也只是局部不会引起灾难,那在这种场景下,事后校验的意义就显得很大,可以提前验证功能和数据的正确性,又不会对线上造成强耦合的影响;在功能完全上线后,事后校验的作用在于及时发现数据不一致问题,避免问题的进一步扩散。

综上所述,对于业务数据校验时效性不是那么高的场景下,离线校验是一种比较合适的方式,开发接入成本都较低,对于业务数据校验时效性有一些要求的场景下,事后校验是一种比较适合的方式,对于业务校验时效性要求非常严格,并且能够投入较多资源的情况下,事前校验比较适合。

数据一致性检测实践案例

案例一:会员系统

某店铺会员入会业务,需要结合店铺系统、打标系统、会员系统进行入会退会操作,如下图所示:

lADPDgQ9rMQbY_fNARPNAgU_517_275_jpg_620x10000q90g

在这个业务场景中,买家在店铺会员页发起入会申请,入会成功对外发送会员入会metaq消息,下游业务系统根据这个metaq消息,为该用户打上一个标签,用户在下单的时候就根据这个标签判断是否有优先购买的权利。既然有入会就有退会,退会同样发起metaq消息给用户进行去标操作。所以不管入会还是退会,业务上要求店铺系统的会员状态(入会还是退会)必须和用户系统的标签状态一致(有或者没有),一旦发现数据不一致,一个已经退会的用户如果还有用户会员标签,该用户就可以购买这个限购商品,这样就会造成商家资损。因此必须有对账业务对数据一致性进行强保证,一旦发现数据不一致,必须要通知相关人员进行数据核对,如有问题则进行数据订正。

这个案例在对账系统的选择上有如下几个要求:

  1. 实时:必须当天尽快处理。
  2. 可以报警
  3. 必须支持不同领域模型。
  4. 接口调用需要有一定的延迟,以便下游系统处理完所有流程之后再校验。
  5. 由于入会、退会metaq可能会有丢失或者乱序的情况,因此不可以根据该消息进行对账。

在这个业务场景下,我们可以看到,业务是异步的,会员系统发起入会操作后,并不是立刻就能在用户系统打标的,所以实时的事前校验并不适合这个场景,因为在会员系统发起入会操作的时候在用户系统中还查不到这个打标状态,需要延迟一段时间去查,所以只能用事后校验来做。

我们在这个场景的做法是:拉取店铺会员数据库的实时binlog日志数据,给到校验系统,校验系统解析日志数据拿到要打标的会员id,并且延时一段时间后去会员系统查询这个会员的入会状态,和日志中的状态进行一致性比对,发现不一致则进行告警。

案例二:新老库迁移

当新老系统需要进行更替的时候,经常会涉及到数据迁移,由于数据量非常大,而且不允许停机,所以迁移一定是一个循序渐进的过程,整个过程会分成两个部分,第一个部分是双写,保证新增数据两边同步。第二步是开始做存量数据迁移,通过后台任务慢慢跑。在这个过程中可能会出现部分字段没有同步,更新数据顺序错乱导致数据内容不一致的问题,所以需要对迁移进行数据的一致性检查,及时发现数据问题进行订正或者bug修复。

由于我们的目的是将数据迁移到新系统,所以数据校验触发条件就是新系统有数据写入,这里可能有人会问如果老系统同步失败呢,那么新系统就不会有数据写入,就触发不了校验。这里就存在校验边界的问题,即我们假设同步系统是一定会同步成功的,如果同步失败的话不允许跳过会一直尝试重试同步,所以这里如果发生同步失败,同步会暂停并且打印出同步错误日志,这个就不是校验系统的问题了,我们会通过同步的进度或者同步日志来观察到这个现象。

所以我们在这个场景的做法是:接收新库的数据库变更binlog日志数据,解析日志内容,通过这条数据id去查询旧库的对应数据,进行数据内容的比对。由于双写的存在,一条数据可能会变更多次,这里就要求我们的校验必须是较为实时的进行,否则就会出现拿到的日志数据内容是旧的(这条数据又发生了更新),导致查询老库的数据出现不一致的问题,其实算是一种误报。

lADPDgQ9rMQbY_rNAZvNAcU_453_411_jpg_620x10000q90g

推荐工具&产品

  • AHAS —— 阿里云应用高可用服务,提供企业级的流量控制、故障评测等高可用能力
  • APDS —— 阿里云应用发现服务,支持自动资产盘点,帮助企业实现快速上云搬站

作者信息:高超,花名龙多,高可用架构技术专家,集团业务检验平台负责人,参与了4次双十一大促系统保障工作,多年业务数据对账和资损防控相关经验。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
算法 关系型数据库 MySQL
TiDB保证数据一致性的策略与优势
【2月更文挑战第28天】TiDB作为一款分布式数据库,通过其独特的策略和优势,确保在分布式环境下数据的一致性。本章将详细探讨TiDB保证数据一致性的核心策略,包括其采用的分布式一致性协议、数据复制机制以及容错处理等方面,并阐述这些策略所带来的优势。通过理解TiDB的数据一致性保证机制,读者将能更深入地认识其作为分布式数据库的价值。
|
21天前
|
监控 应用服务中间件 测试技术
4种典型限流实践保障应用高可用
大家好,我叫黄博文,花名延枚,目前负责云效旗下产品Flow流水线的设计和开发。在微服务架构下,服务越来越多,服务之间的调用也会越来越复杂。如何保障服务的高可用性就成为了一个挑战。之前我参与过的某个产品就曾出过故障,原因是某个API调用突然间增加了数十倍,导致服务负载过高,影响了用户使用。如果当时能够...
4种典型限流实践保障应用高可用
|
存储 JSON 算法
【分布式技术专题】「架构实践于案例分析」盘点分布式服务的(无状态\有状态)认证实现方案
【分布式技术专题】「架构实践于案例分析」盘点分布式服务的(无状态\有状态)认证实现方案
279 0
【分布式技术专题】「架构实践于案例分析」盘点分布式服务的(无状态\有状态)认证实现方案
|
缓存 数据可视化 安全
C++ 最佳实践 | 6. 性能
C++ 最佳实践 | 6. 性能
128 0
|
人工智能 安全 前端开发
【音频】如何保证Serverless业务部署更新的一致性|学习笔记
快速学习【音频】如何保证Serverless业务部署更新的一致性。
170 0
【音频】如何保证Serverless业务部署更新的一致性|学习笔记
|
SQL 前端开发 JavaScript
6款 Retool 最佳替代方案
本篇文章的目的通过低代码平台使用者的视角引出细节,了解他们为什么使用低代码平台以及会选择哪个低代码平台来加速内部系统的开发。
707 0
6款 Retool 最佳替代方案
|
缓存 监控 网络协议
技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期。
632 0
技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
如何设计可靠的灰度方案
一个较大的业务或系统改动,往往会影响整个产品的用户体验或操作流程。为了控制影响面,可以选取一批特定用户、流程、单据等,只允许这一部分用户或数据按照变更后的新逻辑在系统中流转,而另一部分用户仍然执行变更前的老逻辑。这一步是线上系统灰度方案的起点。
如何设计可靠的灰度方案
|
监控 负载均衡 数据可视化
实现业务高可用一些关键点
参与《美团点评技术沙龙》 活动,和美团点评的技术大牛深度交流,根据他们的经验结合自己的实践,自己做了一些简单的整理。
540 0
|
测试技术
业务系统 Over 阿里云性能压测的最佳实践
业务系统性能压测的最佳实践 压测工具的选择 目前主流的压测工具有 ab Jmeter 阿里云PTS 如何来选择呢,我们建议如果是简单压测,可以直接使用ab来进行,它可以通过一条命令来快速的发起指定并发数的请求。
2047 3