【问题标题】:How to update table in the related microservices when entity is created in one microservices在一个微服务中创建实体时如何更新相关微服务中的表
【发布时间】:2021-09-27 07:09:24
【问题描述】:

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

如下所示,

  1. 商务女士
  2. 客户女士
  3. 税收毫秒

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

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

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

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

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

【问题讨论】:

  • 我的首选方法是让业务服务在创建/编辑/删除时将事件发布到队列,任何其他关心订阅该事件并在收到时处理的服务。干净、一劳永逸,并可扩展到任何未来需要相同功能的服务。
  • 在这种情况下,如果我们需要状态返回?消费者是否必须向发布者发送一条表明成功的消息?是这样的吗?

标签: microservices asp.net-core-webapi event-driven-design asp.net-core-hosted-services


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我正在使用的 RabbitMQ,它会跟踪您提到的所有内容。谢谢!
猜你喜欢
  • 2019-11-01
  • 2018-09-08
  • 2018-07-04
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多