跨系统数据一致性方案的思考(上)

简介: 本文主要意在总结沉淀现有问题解决经验过程,整理解决跨系统数据不一致问题的经验方法。跨系统数据一致性,比较优秀的解决方案就是微服务化,不同应用系统采用统一数据源方式,这样可以有效避免数据一致性问题。但是我们很多系统由于历史原因或者业务缘由,导致非服务化情况下,又要采取数据一致性方案。

1、导读


本文主要意在总结沉淀现有问题解决经验过程,整理解决跨系统数据不一致问题的经验方法。


跨系统数据一致性,比较优秀的解决方案就是微服务化,不同应用系统采用统一数据源方式,这样可以有效避免数据一致性问题。


但是我们很多系统由于历史原因或者业务缘由,导致非服务化情况下,又要采取数据一致性方案。


2、背景


业务场景简单描述如下:


上游系统(生成订单数据)→ 业务端系统A(进行订单流程作业管理)→ 用户端系统B(将订单作业流程映射成用户流程,供用户查看)


业务端系统A进行任何订单流程作业相关的管理操作,都需要周知到用户端B系统。示意图如下所示:

微信图片_20220607130313.png




3、问题


Q:那如何实现业务端系统A-用户端系统B的跨系统数据同步呢?


4、分析及解决


阶段1:业务试点一个城市,快速上线应用


现有技术方案对比分析:


1、对于订单数据,共用业务端系统A-数据库

微信图片_20220607130325.png



存在的弊端:


   1)对DB-A数据库造成查询压力;


   2)对DB-A数据库强依赖,用户端系统B处理逻辑需要配合业务端A数据结构变更随时做调整;


   3)系统间强耦合,DB-A数据库问题会直接影响业务端系统A服务可用性(SLA)及性能。


2、利用Redis Set实现简单数据同步方案


微信图片_20220607130333.png


此方案主要解决:


   1)业务端A数据变动,异步通知用户端B知晓;


   2)Redis Set方式以1min为单位同步数据,过滤短时间内频繁操作订单造成的数据请求压力。


存在的弊端:


   1)Redis异常,数据丢失无恢复方案,只能针对时间等条件筛选后批量拉取修复;


   2)业务端A 直接SQL刷DB数据时,用户端B无感知。


其他工具的准备:


   对于业务端A刷数据或同步丢失造成未同步交易单情况,开发数据工具来手动恢复:可以指定订单ID,手动同步业务端A数据到用户端B,灵活快速,便于问题数据的修复。


阶段2:业务发展较快,复杂度上升,多城市落地


为了应对业务快速发展,业务订单类型和流程操作复杂度急剧上升,同时还存在拓城需求(一城一策)


原同步方式无论从性能上还是稳定性方面,都不足以应对当前的需求。


计划改造为Kafka方式进行数据同步,示例图如下:


微信图片_20220607130338.png

此方案主要优势:


   1)使用kafka解耦两端系统为生产、消费端,对于高并发情况有效削峰,同时保障队列数据不丢失;


   2)消息处理效率提升


Kafka方式传递消息体,处理性能及数据保障增强。


在实际业务中,消息量可能会随着业务量增长,由于系统消费能力有限,消息可能产生堆积,而消费端对消息有保留时长,可能会导致消息丢失,所以对核心数据消费以及消息大数据量消费需要配置kafka消息堆积监控。当出现监控报警时能及时考虑当前业务是否收到影响,并且从代码的角度是否有优化的空间,例如及时抛弃无效消息,kafka参数是否配置合理等。


假如消息生产端(业务端系统A)出现消息的阻塞,同样会影响跨系统的数据一致性,如下图所示:

微信图片_20220607130342.png


上述问题主要的解决方案:


   1)监控完善(将触发kafka生产端的异步消息队列和kafka堆积消息进行监控)


   2)系统B直接监听上游数据,与系统A数据做融合(前提是确定好数据的唯一性标识)


阶段3:统一数据服务


从系统改进里程碑来看,目前仍属于冗余式存储实现,那如何从根本上解决跨系统交易单数据一致性问题呢?


消除数据不一致问题,归根结底就是要将数据源进行统一


微信图片_20220607130346.png


目前我们正计划从平台层面推进DDD领域服务划分及服务化的建设落地,后续的问题及解决经验后期再同大家进行分享。

关于为什么使用DDD领域服务划分?


主要是考虑DDD的Bounded context概念特别有利于识别微服务,可以作为划分服务的


一种依据。正好与微服务的设计思想关键点相契合:边界和粒度。


5、总结


1、任何架构方案都是不断演进的


2、架构的目的是解决业务问题


    能够解决当前问题的架构方案,同时兼具易于扩展及维护,那就是一个优秀的架构。


3、软件设计过程中,不需要刻意去应用消息队列使用场景


    而当需要引入时,要同时考虑开发、维护成本以及对应性能的提升的性价比,否则得不偿失。

相关文章
|
7月前
|
算法 关系型数据库 MySQL
TiDB保证数据一致性的策略与优势
【2月更文挑战第28天】TiDB作为一款分布式数据库,通过其独特的策略和优势,确保在分布式环境下数据的一致性。本章将详细探讨TiDB保证数据一致性的核心策略,包括其采用的分布式一致性协议、数据复制机制以及容错处理等方面,并阐述这些策略所带来的优势。通过理解TiDB的数据一致性保证机制,读者将能更深入地认识其作为分布式数据库的价值。
|
架构师 数据库
深入探讨分布式事务:解析跨多个数据库的一致性
在现代应用程序中,分布式系统已经变得越来越普遍,但同时也带来了一系列的挑战。其中之一就是分布式事务管理,它涉及到在多个数据库或服务之间保持一致性和可靠性。本文将深入介绍分布式事务的概念,探讨不同的实现方式以及它们的优缺点。无论您是开发人员、系统管理员还是系统架构师,了解分布式事务是构建稳健分布式系统的关键一步。
|
2月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性?
微服务架构中,如何确保服务之间的数据一致性?
|
7月前
|
存储
云存储中的数据一致性与冗余策略
【5月更文挑战第31天】云存储关键在于数据一致性和冗余策略。强一致性确保所有副本始终同步,可能影响性能;最终一致性允许短暂不一致,最终达一致。多副本策略复制数据提高可用性,纠删码策略通过编码创建冗余。结合两者以平衡性能与准确性。选择合适策略可提升云存储系统性能、可用性和可靠性,未来研究将深化这一领域。
103 1
|
3月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
6月前
|
监控 关系型数据库 分布式数据库
PolarDB故障恢复机制:快速恢复与数据一致性保障
【6月更文挑战第29天】**PolarDB云原生数据库的故障恢复机制确保高可用性与数据一致性。利用ROW快照备份实现秒级备份,结合Redo Log进行时间点恢复。通过日志分析定位故障,快速启动备用实例恢复服务。分布式事务及强一致性读保证数据完整性。PolarDB的高效恢复策略是其在云数据库市场中的关键优势。**
150 16
|
canal 存储 算法
跨系统实时同步数据解决方案
数据量太大,单存储节点存不下,就只能把数据分片存储。
1225 0
|
7月前
|
算法 安全 程序员
揭秘分布式系统:日志复制如何保障数据一致性?
本文介绍了分布式系统中的日志复制技术,这是保证高可用性和数据一致性的重要手段。以Raft算法为例,文章阐述了Leader如何将客户端请求复制到Follower的日志中:Leader首先记录请求,然后通过RPC发送给Follower,等待ACK确认,必要时进行重试。当多数Follower确认后,Leader提交日志并通知Follower。文中还提到了网络分区和日志一致性等挑战,以及应对策略,如超时机制、领导选举、日志匹配和压缩。最后,强调了日志复制在面对故障时确保系统一致性和可用性的作用。
279 4
|
关系型数据库 MySQL 数据库
深入探析MySQL中的隔离性级别:保障数据一致性的关键
在关系型数据库中,隔离性是事务特性中的一个重要方面。它确保了在多个并发事务同时操作数据库时,各个事务之间的操作不会相互干扰,从而保障了数据的一致性和正确性。MySQL作为一款广泛使用的关系型数据库,提供了多种隔离性级别供开发者选择。本文将深入探讨MySQL中的隔离性级别,介绍不同级别的特点、用途以及可能的问题。
404 0
|
新零售 消息中间件 存储
保证分布式系统数据一致性的6种方案
在电商等业务中,系统一般由多个独立的服务组成,如何解决分布式调用时候数据的一致性?
4309 0
下一篇
DataWorks