【问题标题】:Kafka conditional producing/consuming卡夫卡条件生产/消费
【发布时间】:2020-02-20 01:16:20
【问题描述】:

我有这种情况:

  • 微服务 MS1 有一个数据库,假设有 N 条记录,并且外部源提供了新数据,如果有效,则应将其持久化

  • 验证过程由作为 kafka 主题 T1 消费者的微服务 MS2 执行,MS1 在该主题上发送新数据

  • 潜在 N+1 记录的验证涉及对所有先前 N 记录的查询。如果验证成功,MS2 会在主题 T2 上生成结果,MS1 是主题 T2,因此它可以持久化新的有效数据。

问题如下。

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

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

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

非常感谢任何帮助或新的解决方案。

谢谢!

【问题讨论】:

  • 为什么 MS2 验证 MS1 的数据?这听起来有点奇怪。每个微服务都应该验证它自己的数据。验证是特定微服务业务逻辑的一部分,除非您有充分的理由,否则不应扩展到 2 个服务?
  • @xargs 因为 MS2 中的验证逻辑被许多其他服务共享使用
  • 为什么会这样?通常,vlaidation 逻辑应该与特定微服务的其余逻辑放在一起。如果您有一些通用逻辑,即验证一些通用事物并在多个微服务中使用,您可以将其提取到库中,并在您需要的微服务中重用它。您能告诉我您将系统拆分为微服务的标准是什么吗?
  • 如果我对验证器进行更改并将其作为库包含,我必须重建并重新部署每个使用它的应用程序
  • 我根据您的情况发布了一个带有可能选项的答案。

标签: rest apache-kafka microservices


【解决方案1】:

根据您在此处提供的信息,我认为您有 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 命令或查询方法(请阅读此answer,了解微服务之间的通信方式)。通过 REST 从其他微服务调用一个微服务并没有错,在某些情况下,您别无选择。请记住,当您调用另一个 api 进行验证时,您会遇到一些延迟。

结论

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多