架构师带你搞明白微服务进阶场景实战:服务之间的数据依赖问题

简介: 数据同步上面讲解了数据一致性的解决方案,这一篇来讲讲服务之间的数据依赖问题,还是先来说说具体的业务场景。业务场景:如何解决微服务之间的数据依赖问题在某个供应链系统中,存在商品、订单、采购这3个服务,它们的主数据部分结构表如下。

数据同步

上面讲解了数据一致性的解决方案,这一篇来讲讲服务之间的数据依赖问题,还是先来说说具体的业务场景。

业务场景:如何解决微服务之间的数据依赖问题

在某个供应链系统中,存在商品、订单、采购这3个服务,它们的主数据部分结构表如下。

而在设计这个系统时,需要满足以下两点需求。

1)根据商品的型号、分类、生成年份、编码等查找订单。

2)根据商品的型号、分类、生成年份、编码等查找订单或采购单。

初期方案是这样设计的:首先,按照严格的微服务划分原则,把商品相关的职责放在商品服务中,所以在订单与采购单查询过程中,如果查询字段包含商品字段,就按照如下顺序进行查询。

1)先根据商品字段调用商品服务,然后返回匹配的商品信息。

2)在订单服务或采购服务中,通过IN语句匹配商品ID,再关联查询对应的单据。

订单的整个查询流程如图14-1所示。

• 图14-1 查询流程

初期方案设计完成后,很快就碰到了一系列问题。

1)随着商品数量的增多,匹配到的商品越来越多,于是订单和采购服务中包含IN语句的数据查询效率越来越低。

2)商品服务作为一个核心服务,依赖它的服务越来越多,同时随着商品数据量的增长,商品服务开始不堪重负,响应也变慢,还存在请求超时的情况。

3)因为商品服务超时,使得依赖它的服务处理请求也经常失败。

这就导致业务方查询订单或者采购单时,每次只要加上商品ID这个关键字,查询效率就会很低,而且经常失败,于是团队想出了一个新的方案——冗余。

数据冗余方案

数据冗余方案即在订单、采购单中保存一些商品的字段信息,具体如下。

通过这样的方案,每次查询订单或采购单时,就不需要依赖商品服务了,但是商品如果有更新,怎么同步冗余的数据呢?有两种处理办法。

1)每次更新商品时,先调用订单与采购服务,然后更新商品的冗余数据。

2)每次更新商品时,发布一条消息,订单与采购服务各自订阅这条消息,再各自更新商品的冗余数据。

前面讲解数据一致性问题时曾提到过类似的场景。

那么这两种处理办法会出现什么问题?

先说说第一种处理办法:如果商品服务每次更新商品时,都需要调用订单与采购服务,然后再更新冗余数据,则会出现以下两个问题。

1)数据一致性问题:如果订单和采购服务的冗余数据更新失败,整个操作就要回滚,商品服务的开发人员肯定不希望如此,因为冗余数据并又不是商品服务的核心需求,为什么要因为边缘流程而阻断了自身的核心流程?

2)依赖问题:从职责来说,商品服务应该关注商品本身,但是现在商品服务还需要调用订单、采购的服务。而且作为一个核心服务,依赖它的服务太多了,即后续每次商品服务更新商品时,都需要调用订单冗余数据更新、采购冗余数据更新、门店库存冗余数据更新、运营冗余数据更新等众多服务。

商品服务本意是要设计成底层服务,但是如果使用这种方案,它要依赖于很多其他服务,与原来作为底层服务的初衷相悖。因此,第一个方案直接被否决了。

下面讲第二种处理办法。通过消息发布订阅的方案有以下几点好处。

1)商品无须再调用其他服务,它只需要关注自身的逻辑,最多生成一条消息到MQ。

2)如果订单、采购等服务的冗余数据更新失败了,只需要使用消息重试机制就可以保证数据的一致性。

此时方案的架构如图14-2所示。

这样的方案已经比较完善了,而且开发人员基本都是这么做的,不过这个方案存在以下几个问题。

1)商品表的冗余数据需要更新(商品分类ID和生产批号ID)。

在这个项目中,仅仅把冗余数据进行保存远远不够,还需要将商品分类与生产批号的清单进行关联查询。也就是说,每个服务不仅要订阅商品变更一种消息,还需要订阅商品分类、商品生产批号的变更消息。

• 图14-2 基于消息订阅的数据同步方案

而且这里只是列举了一部分的结构,事实上,商品表中还有很多其他的字段是冗余的,比如保修类型、包换类型等。为了更新这些冗余数据,采购服务与订单服务往往需要订阅近10种消息,基本上要把商品的一小半逻辑复制过来。

2)每个依赖的服务需要重复实现冗余数据更新同步的逻辑。前面讲过,采购、订单及其他的服务都需要依赖商品数据,因此每个服务都需要把冗余数据的订阅、更新逻辑做一遍,最终重复代码就会很多。

3)MQ消息类型过多。联调时最麻烦的是MQ之间的联动,如果是接口联调还比较简单,因为调用服务器的接口相对可控而且比较容易追溯,但是如果是消息联调,因为经常不知道某条消息被哪台服务节点消费了,为了让特定的服务器消费特定的消息,就需要临时改动双方的代码,然而联调完成后,开发人员常常忘记把代码改回来。

因为并不希望出现这么多消息,特别是冗余数据这种非核心需求,最终项目组决定使用一个特别的同步冗余数据的方案,接下来进一步说明。

解耦业务逻辑的数据同步方案

解耦业务逻辑的数据同步方案设计思路是这样的。

1)将商品及商品相关的一些表(比如分类表、生产批号表、保修类型、包换类型等)实时同步到需要依赖和使用它们的服务的数据库,并且保持表结构不变。

2)在查询采购、订单等服务中的数据时,直接关联同步过来的商品相关表。

3)不允许采购、订单等服务修改商品相关表。

此时,整个方案架构如图14-3所示。

以上方案能轻松避免以下两个问题。

1)商品无须依赖其他服务,如果其他服务的冗余数据同步失败,它也不需要回滚自身的流程。

2)采购、订单等服务无须关注冗余数据的同步。

• 图14-3 解耦业务逻辑的数据同步方案

这个方案的缺点是增加了订单、采购等数据库的存储空间(因为增加了商品相关表)。

计算后会发现,之前数据冗余的方案中每个订单都需要保存一份商品的冗余数据,假设订单总量是1000万,商品总数是10万。如果采用之前数据冗余的方案,1000万条订单记录就要增加1000万条商品的冗余数据,相比之下,目前的方案更省空间,因为只增加了10万条商品的数据。

那么如何实时同步相关表数据呢?请看下节讲解。

本文给大家讲解的内容是微服务进阶场景实战:数据同步

  1. 下篇文章给大家讲解的内容是微服务进阶场景实战:基于Bifrost的数据同步方案
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!!
  4. 本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。
相关文章
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1526 3
|
12月前
|
数据采集 缓存 前端开发
如何开发门店业绩上报管理系统中的商品数据板块?(附架构图+流程图+代码参考)
本文深入讲解门店业绩上报系统中商品数据板块的设计与实现,涵盖商品类别、信息、档案等内容,详细阐述技术架构、业务流程、数据库设计及开发技巧,并提供完整代码示例,助力企业构建稳定、可扩展的商品数据系统。
|
10月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
10月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1439 2
Spring Boot 3.x 微服务架构实战指南
|
11月前
|
数据采集 机器学习/深度学习 搜索推荐
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
MIT与丰田研究院研究发现,扩散模型的“局部性”并非源于网络架构的精巧设计,而是自然图像统计规律的产物。通过线性模型仅学习像素相关性,即可复现U-Net般的局部敏感模式,揭示数据本身蕴含生成“魔法”。
411 3
MIT新论文:数据即上限,扩散模型的关键能力来自图像统计规律,而非复杂架构
|
12月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
1041 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
11月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。
|
数据采集 监控 数据可视化
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
本案例讲述了在豆瓣电影数据采集过程中,面对数据量激增和限制机制带来的挑战,如何通过引入爬虫代理、分布式架构与异步IO等技术手段,实现采集系统的优化与扩展,最终支撑起百万级请求的稳定抓取。
629 0
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
|
SQL 数据采集 数据处理
终于有人把数据架构讲清楚了!
本文深入浅出地解析了数据架构的核心逻辑,涵盖其定义、作用、设计方法及常见误区,助力读者构建贴合业务的数据架构。
|
12月前
|
缓存 前端开发 BI
如何开发门店业绩上报管理系统中的门店数据板块?(附架构图+流程图+代码参考)
门店业绩上报管理是将门店营业、动销、人效等数据按标准化流程上报至企业中台或BI系统,用于考核、分析和决策。其核心在于构建“数据底座”,涵盖门店信息管理、数据采集、校验、汇总与对接。实现时需解决数据脏、上报慢、分析无据等问题。本文详解了实现路径,包括系统架构、数据模型、业务流程、开发要点、三大代码块(数据库、后端、前端)及FAQ,助你构建高效门店数据管理体系。

热门文章

最新文章