rest - 卡夫卡条件生产/消费
问题描述
我有这种情况:
微服务 MS1 有一个数据库,假设有 N 条记录,并且外部源提供新数据,如果有效,则应持久保存
验证过程由作为 kafka 主题 T1 消费者的微服务 MS2 执行,MS1 在该主题上发送新数据
潜在 N+1 记录的验证涉及对所有先前 N 记录的查询。如果验证成功,则 MS2 会在主题 T2 上生成结果,其中 MS1 是消费者,因此它可以持久保存新的有效数据。
问题如下。
想象一下,N+1 个有效的新数据太大,需要很长时间才能写入 db:可能会发生潜在N+2 记录的验证失败,因为查询 db 只有 N 条可用记录,而不是 N +1。
是否有可能以某种方式使用 kafka 功能暂停验证过程,直到 MS1 提交数据库上的先前有效数据?
不使用 kafka,我发现确保对最新数据库进行验证查询的唯一方法是在两个微服务之间进行休息调用,以便等待彼此的响应。
任何帮助或新的解决方案将不胜感激。
谢谢!
解决方案
根据您在此处提供的信息,我认为您有 3 个选项可以在此处执行:
将 MS2 验证逻辑复制到 MS1
将 MS2 验证逻辑提取到共享库
使用 Rest 调用直接从 MS1 调用 MS2 微服务
选项说明:
验证逻辑是业务逻辑的重要部分之一,应该始终是验证实体/聚合的同一微服务的一部分。起初复制听起来很奇怪,甚至可能是错误的,但在这种情况下,与在 2 个微服务中使用它相比,它可以为您节省大量开销。这样做你只需要重新部署你的 MS1(从上面回答你的评论)。请记住,否则 2 个微服务之间的网络通信会给您带来很多问题,例如:性能、延迟、网络故障、分布式事务等。
将公共共享验证逻辑提取到某种库中(例如在 .NET nuget 中,在 Node.js npm 中......)并将其作为包包含在您的微服务 MS1 中也是一种选择。这样您就不会在所有微服务中复制代码,但是如果您的业务需要进行某些验证更改,您将需要对所有微服务进行更改。如果发生这种情况,您将需要重新设计您的库和/或将一些代码提取回原始微服务。
可以通过命令或查询方法直接使用 REST API 从 MS1 调用 MS2(有关微服务之间通信方式的说明,请阅读此答案)。通过 REST 从其他微服务调用一个微服务并没有错,在某些情况下,您别无选择。请记住,当您调用另一个 api 进行验证时,您会遇到一些延迟。
结论
我强烈建议您使用 1. 选项并将验证逻辑从 MS2 复制到 MS1。验证是域逻辑的一部分,应该在您拥有逻辑的同一个微服务中。这种或类似的验证逻辑可能适用于其他微服务,但每个微服务都应该有自己的实现。选项 2. 主要用于一些与业务无关的事情,例如通用测试基础设施、通用数据库访问(存储库类)、通用通信机制等。如果您想调用其他微服务以获取一些信息或发送一些命令(例如为我保留此产品或类似),选项 3. 会更好,但为了进行验证,我会避免这种情况。绝对需要额外的网络调用来进行验证。
推荐阅读
- csv - csv 文件数据集的 getMetadata 活动中的结构忽略文件第一行中的额外逗号
- python - 从两个数据框python中删除某些数字
- android - React Navigation 适用于 Android 虚拟设备,但不适用于真实的 Android 设备
- python - python3菱形继承如何作用于数据字段?如何用 super()._init__ 初始化继承的字段?
- python - 如何将循环函数创建的值插入到 tkinter 文本框中,这些文本框也是使用循环函数自动创建的
- flutter - 如何在 Flutter 中使用分组元素进行无限滚动分页?
- javascript - 修复 Heroku 503 超时
- hyperledger-fabric - 使用 node.js 应用程序调用链码时无法连接到发现的排序器
- ios - 自定义电容器插件因 pod 依赖性而失败
- sql-server - 如果该表的适当ID存在于另一个表中,我想汇总特定表列中的所有数据