首页 > 解决方案 > 卡夫卡条件生产/消费

问题描述

我有这种情况:

问题如下。

想象一下,N+1 个有效的新数据太大,需要很长时间才能写入 db:可能会发生潜在N+2 记录的验证失败,因为查询 db 只有 N 条可用记录,而不是 N +1。

是否有可能以某种方式使用 kafka 功能暂停验证过程,直到 MS1 提交数据库上的先前有效数据?

不使用 kafka,我发现确保对最新数据库进行验证查询的唯一方法是在两个微服务之间进行休息调用,以便等待彼此的响应。

任何帮助或新的解决方案将不胜感激。

谢谢!

标签: restapache-kafkamicroservices

解决方案


根据您在此处提供的信息,我认为您有 3 个选项可以在此处执行:

  1. 将 MS2 验证逻辑复制到 MS1

  2. 将 MS2 验证逻辑提取到共享库

  3. 使用 Rest 调用直接从 MS1 调用 MS2 微服务


选项说明:

  1. 验证逻辑是业务逻辑的重要部分之一,应该始终是验证实体/聚合的同一微服务的一部分。起初复制听起来很奇怪,甚至可能是错误的,但在这种情况下,与在 2 个微服务中使用它相比,它可以为您节省大量开销。这样做你只需要重新部署你的 MS1(从上面回答你的评论)。请记住,否则 2 个微服务之间的网络通信会给您带来很多问题,例如:性能、延迟、网络故障、分布式事务等。

  2. 将公共共享验证逻辑提取到某种库中(例如在 .NET nuget 中,在 Node.js npm 中......)并将其作为包包含在您的微服务 MS1 中也是一种选择。这样您就不会在所有微服务中复制代码,但是如果您的业务需要进行某些验证更改,您将需要对所有微服务进行更改。如果发生这种情况,您将需要重新设计您的库和/或将一些代码提取回原始微服务。

  3. 可以通过命令或查询方法直接使用 REST API 从 MS1 调用 MS2(有关微服务之间通信方式的说明,请阅读此答案)。通过 REST 从其他微服务调用一个微服务并没有错,在某些情况下,您别无选择。请记住,当您调用另一个 api 进行验证时,您会遇到一些延迟。

结论

我强烈建议您使用 1. 选项并将验证逻辑从 MS2 复制到 MS1。验证是域逻辑的一部分,应该在您拥有逻辑的同一个微服务中。这种或类似的验证逻辑可能适用于其他微服务,但每个微服务都应该有自己的实现。选项 2. 主要用于一些与业务无关的事情,例如通用测试基础设施、通用数据库访问(存储库类)、通用通信机制等。如果您想调用其他微服务以获取一些信息或发送一些命令(例如为我保留此产品或类似),选项 3. 会更好,但为了进行验证,我会避免这种情况。绝对需要额外的网络调用来进行验证。


推荐阅读