microservices - 在一个微服务中创建实体时如何更新相关微服务中的表
问题描述
我正在学习微服务架构并创建了 3 个微服务。每个 ms 都有自己的数据库。
像下面这样的东西,
- 商务女士
- 客户女士
- 税务女士
我通过在所有微服务中复制Business
表来设计它。每当在 Business ms 中创建新业务时,我想更新业务Id
以及name
在 Customers ms 和 Tax ms 中创建参考。
我试图通过以下方式实现这一目标,
托管服务 - 这将注册为业务微服务的一部分,当在业务表中添加新行时,我将该行添加到
System.Threading.Channels
. HostedService 将读取队列,然后调用 Customers ms 和 Tax ms API 来更新 Business Id 和 Name。事件驱动 API - 我还没有实现这一点。想法是让企业女士作为生产者,客户女士和税务女士作为消费者。
实现这一目标的最佳方法是什么?请问对此有什么想法吗?
解决方案
我们的需求和你提到的一样,我们采用事件驱动的架构来解决这个问题。
Apache Kafka 是满足此类要求的最佳消息传递系统。
实施时需要考虑的几件事。
假设 CRUD 微服务(与 DB 交互并持久化主要实体)将数据保存到 DB 并且 Kafka 服务器(任何消息传递系统)已关闭,那么它将出现数据不一致。此问题的解决方案是,您需要创建一个新表来跟踪发布时失败的事件。在后台,corn 作业将获取所有失败的事件并尝试再次发布。
您成功地在主题上发布了事件,但消费者已关闭。在这种情况下,您不需要做任何事情,因为一旦消费者启动,它将开始阅读消息。(注意考虑消息的保留期)
你在topic上成功发布了事件,消费者已经启动并运行,但是由于数据格式问题,消息没有被消费,那么这种情况下,微服务之间再次发生数据不一致。在这种情况下,需要将该事件数据推送到 DLQ 并需要再次解析。
推荐阅读
- javascript - 如何将我的代码转换为正确的 jsx 格式?
- matlab - MATLAB-注水算法-无限循环
- javascript - 什么更节省资源:lodash deepEqual 或每次都创建一个新对象?
- spring-boot - TestRestTemplate vs WebTestClient vs RestAssured:什么是 Spring Boot Rest API 集成测试的最佳方法
- java - 比较2队实力,找出获胜概率
- python - 从 Pandas DataFrame 中的 groupby 解包列表 - Python
- instagram - 用于检索 hastag 的图片的 Instagram 网址
- reactjs - TypeScript 新手,这段代码有什么作用?
- java - 无法使用 Adopt JRE 启动 jnlp
- firebase - 在 Firestore 中保存持续时间的推荐方法是什么?