微服务,顾名思义,就是把我们的程序拆分成最小的单元来提供服务。在集成系统中,每个微服务无法独立存在。那么微服务之间涉及到的数据依赖问题应该如何处理呢?我们从场景入手来分析和思考此类问题。
供应链系统中,存在三个微服务:商品、销售订单、采购。他们的主数据部分具有以下数据结构:
项目:
订单和子订单:
采购订单和子订单:
在设计这个供应链系统时,我们需要满足以下两个要求:
我们最初的方案是这样设计的:产品相关的职责严格按照微服务划分原则存储在产品系统中。因此,在查询订单和采购订单时,如果查询字段包含产品字段,我们需要按照以下顺序查询:
为了方便理解这个流程,订单查询流程图如下:
初步方案设计完成后,很快我们就遇到了一系列的问题:
结果是,业务方每次查询订单或者采购订单时,只要包含关键字product,查询效率就会非常慢,总是失败。于是,我们重新思考了一个新的解决方案——数据冗余。我们一起来看看吧。
简单来说,数据冗余就是在订单、采购订单中保存一些产品字段信息。
为了方便理解,我们将通过上面的实际业务场景来解释两者的区别。
调整架构方案后,我们每次查询都不能再依赖商品服务。
但是如果产品更新了,我们如何同步多余的数据呢?这里分享2个解决方案。
你是不是觉得很眼熟?是的,这就是我们在上一篇文章中提到的数据一致性问题。那么这两种选择会出现什么问题呢?
如果产品服务每次更新产品时都调用订单采购服务,然后更新冗余数据,就会出现以下两个问题。
因此,第一种方案被我们直接拒绝了,也就是我们采用的第二种方案——通过消息发布订阅的方案,因为它有以下2个优点。
此时,我们的架构方案如下图:
这个解决方案看起来相当完美,市面上基本都是这样做的。然而,该解决方案存在以下问题。
1。在此解决方案中,仅保存冗余数据是不够的。我们还需要查询产品分类和生产批号列表。也就是说,每个服务不仅需要订阅产品变更的消息,还需要订阅产品分类、产品生产批号变更等消息。请注意下面订单表结构中加粗部分。
以上仅列出了部分结构。事实上,产品表中有很多冗余字段,比如保修类型、换货类型等,为了更新这些冗余数据,采购服务和订单服务往往需要订阅近十种消息。因此,我们基本上需要复制不到一半的产品逻辑。
2。每个依赖的服务都需要重复冗余数据更新同步的逻辑。正如我们前面提到的,采购、订单等服务都依赖于产品数据。因此,每个服务都需要做冗余数据的订阅和更新逻辑。最终会出现很多重复的代码。
3。 MQ消息类型太多:联调时最麻烦的就是MQ之间的联动。如果是接口联调就比较容易说,因为调用哪个服务器的接口相对可控,更容易追踪;如果是消息联调就比较麻烦,因为我们往往不知道某个消息是被哪个服务节点消费的。为了让特定的服务器能够消费特定的消息,我们需要暂时改变双方的代码。然而,联调完成后,我们常常忘记改回原来的代码。
为此,我们不想冗余数据这个非核心需求出现那么多问题,最终决定采用专门的同步冗余数据解决方案,下面我们会进一步解释。
业务逻辑解耦的数据同步方案设计思路如下:
此时整个解决方案的结构如下图:
上述方案可以轻松解决以下两个问题:
但是,这种方案的“缺点”是增加了订单、采购等数据库的存储空间(因为增加了产品相关的表)。
经过仔细计算,我们发现在之前的数据冗余方案中,每个订单都需要保存一个产品的冗余数据。假设订单总数为N,产品总数为M,且N一般远大于M。因此,在之前的数据冗余方案中,N个订单会产生N个商品的冗余数据。相比之下,业务逻辑解耦的数据同步方案由于只增加了M条数据,因此节省了更多空间。
这时候问题又来了,如何实时同步相关表的数据呢?我们找一个现成的开源中间件就可以了,但是需要满足支持实时同步、支持增量同步、无需编写业务逻辑、支持MySQL、高活性。
基于这五个需求,我们在市场上进行了搜索,发现了Canal、Debezium、DataX、Databus、Flinkx、Bifrost等几款开源中间件。它们之间的区别如下表所示:
从对比表来看,最接近我们需求的开源中间件是Bifrost,原因如下:
因此,我们最终使用了Bifrost开源中间件。此时整个解决方案的架构如下图:
整个架构方案上线后,产品数据的同步比较稳定。这时产品服务的开发者只需要关注自己的逻辑,不再需要关注使用数据的人。如果需要关联使用产品数据的订单,则采购服务的开发人员无需关注产品数据的同步。他们只需要在查询时添加关联语句,实现双赢。
不过,唯一让我们担心的是Bifrost不支持集群,无法保证高可用性。不过,到目前为止,它还没有出现任何停机情况。相反,在多个节点上部署负载均衡的后台服务经常会遇到停机情况。
最后,我们终于解决了服务之间的数据依赖问题。
这里讨论一下服务之间的数据依赖问题,并给出目前比较合适的解决方案。事实上,这里提到的解决方案并不是一个非常流行的解决方案,肯定会存在一些没有考虑到的遗漏问题。如果您有更好的解决方案,欢迎留言讨论。
来源:www.sychzs.cn/u010223407/
文章/详情/121245298
推荐
java面试题书
技术卷入组,一起学习吧! !
PS:因为公众号平台更改了推送规则,如果您不想错过内容,看完后记得点击“正在看”,并添加一个” star”,这样每次有新文章推送,它都会立即出现在你的订阅列表中。 点击“观看”支持我们!