首页 > 解决方案 > 在一个微服务中创建实体时如何更新相关微服务中的表

问题描述

我正在学习微服务架构并创建了 3 个微服务。每个 ms 都有自己的数据库。

像下面这样的东西,

  1. 商务女士
  2. 客户女士
  3. 税务女士

在此处输入图像描述

我通过在所有微服务中复制Business表来设计它。每当在 Business ms 中创建新业务时,我想更新业务Id以及name在 Customers ms 和 Tax ms 中创建参考。

我试图通过以下方式实现这一目标,

  1. 托管服务 - 这将注册为业务微服务的一部分,当在业务表中添加新行时,我将该行添加到System.Threading.Channels. HostedService 将读取队列,然后调用 Customers ms 和 Tax ms API 来更新 Business Id 和 Name。

  2. 事件驱动 API - 我还没有实现这一点。想法是让企业女士作为生产者,客户女士和税务女士作为消费者。

实现这一目标的最佳方法是什么?请问对此有什么想法吗?

标签: microservicesasp.net-core-webapievent-driven-designasp.net-core-hosted-services

解决方案


我们的需求和你提到的一样,我们采用事件驱动的架构来解决这个问题。

Apache Kafka 是满足此类要求的最佳消息传递系统。

实施时需要考虑的几件事。

  1. 假设 CRUD 微服务(与 DB 交互并持久化主要实体)将数据保存到 DB 并且 Kafka 服务器(任何消息传递系统)已关闭,那么它将出现数据不一致。此问题的解决方案是,您需要创建一个新表来跟踪发布时失败的事件。在后台,corn 作业将获取所有失败的事件并尝试再次发布。

  2. 您成功地在主题上发布了事件,但消费者已关闭。在这种情况下,您不需要做任何事情,因为一旦消费者启动,它将开始阅读消息。(注意考虑消息的保留期)

  3. 你在topic上成功发布了事件,消费者已经启动并运行,但是由于数据格式问题,消息没有被消费,那么这种情况下,微服务之间再次发生数据不一致。在这种情况下,需要将该事件数据推送到 DLQ 并需要再次解析。


推荐阅读