Rest 卡夫卡有条件生产/消费

Rest 卡夫卡有条件生产/消费,rest,apache-kafka,microservices,Rest,Apache Kafka,Microservices,我有这样的情况: microservice MS1有一个db,比如说有N条记录,一个外部源提供了新的数据,如果有效的话,这些数据应该被持久化 验证过程由微服务MS2执行,微服务MS2是卡夫卡主题T1的消费者,MS1在其上发送新数据 对潜在N+1记录的验证涉及对之前所有N个记录的查询。如果验证成功,MS2将在主题T2上生成结果,MS1在主题T2上是使用者,因此它可以保留新的有效数据 问题如下 假设N+1有效的新数据太大,需要在db上写很多时间:可能会发生潜在N+2记录的验证失败,因为查询db时

我有这样的情况:

  • microservice MS1有一个db,比如说有N条记录,一个外部源提供了新的数据,如果有效的话,这些数据应该被持久化

  • 验证过程由微服务MS2执行,微服务MS2是卡夫卡主题T1的消费者,MS1在其上发送新数据

  • 对潜在N+1记录的验证涉及对之前所有N个记录的查询。如果验证成功,MS2将在主题T2上生成结果,MS1在主题T2上是使用者,因此它可以保留新的有效数据

问题如下

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

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

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

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


谢谢

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

  • 将MS2验证逻辑复制到MS1

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

  • 通过Rest呼叫直接从MS1呼叫MS2微服务


  • 选项说明:

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

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

  • 直接使用RESTAPI从MS1调用MS2可以通过 命令或查询方法(请阅读本文以了解有关微服务之间通信方式的说明)。从一个微服务调用另一个微服务而不是REST并没有什么错,在某些情况下,您别无选择。请记住,在调用另一个api进行验证时会有一些延迟

  • 结论


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

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

  • 将MS2验证逻辑复制到MS1

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

  • 通过Rest呼叫直接从MS1呼叫MS2微服务


  • 选项说明:

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

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

  • 直接使用RESTAPI从MS1调用MS2可以通过 命令或查询方法(请阅读本文以了解有关微服务之间通信方式的说明)。从一个微服务调用另一个微服务而不是REST并没有什么错,在某些情况下,您别无选择。请记住,在调用另一个api进行验证时会有一些延迟

  • 结论

    我会坚强的