在一个微服务中创建实体时如何更新相关微服务中的表

问题描述

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

类似于下面的内容

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

enter image description here

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

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

  1. 托管服务 - 这将注册为业务微服务的一部分,当业务表中添加新行时,我将该行添加system.threading.channels。 HostedService 将读取队列,然后调用 Customers ms 和 Tax ms API 来更新业务 ID 和名称

  2. 事件驱动的 API - 我还没有做到这一点。想法是让企业 ms 作为生产者,客户 ms 和税收 ms 作为消费者。

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

解决方法

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

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

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

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

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

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