Kafka条件生产/消费

62lalag4  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(343)

我有这样的情况:
microservicems1有一个db,比如说有n个记录,并且外部源提供了新的数据,如果有效的话,这些数据应该被持久化
验证过程由微服务ms2执行,它是kafka主题t1的使用者,ms1在其上发送新数据
对可能的n+1记录的验证涉及对所有先前n个记录的查询。如果验证成功,ms2将在主题t2上生成结果,ms1是该主题的使用者,因此它可以持久化新的有效数据。
问题如下。
假设n+1个有效的新数据太大,需要花费大量的时间在数据库上写入:可能会发生对潜在n+2记录的验证失败,因为查询数据库时只有n个可用记录,而不是n+1。
是否可以以某种方式使用kafka功能暂停验证过程,直到ms1提交了db上以前的有效数据?
不使用kafka,我发现确保对最新数据库进行验证查询的唯一方法是在两个微服务之间进行rest调用,以便等待对方的响应。
任何帮助或新的解决方案都将不胜感激。
谢谢!

bvk5enib

bvk5enib1#

根据您在这里提供的信息,我认为您有3种选择您可以在这里做什么:
将ms2验证逻辑复制到ms1
将ms2验证逻辑提取到共享库
通过rest呼叫直接从ms1呼叫ms2微服务
选项说明:
验证逻辑是业务逻辑的重要部分之一,并且应该始终是验证实体/聚合的同一个微服务的一部分。起初,复制听起来很奇怪,甚至可能是错误的,但在这种情况下,与在2个微服务中使用它相比,它节省了大量开销。这样做,你只需要重新部署你的ms1(回答你的评论从上面)。请记住,否则两个微服务之间的网络通信将给您带来许多问题,如:性能、延迟、网络故障、分布式事务等。
将公共共享验证逻辑提取到某种库中(例如在.net nuget、node.js npm…)并将其作为包包含在微服务ms1中也是一种选择。这样,您就不会在所有的微服务中复制代码,但是如果您对某些验证的业务需求发生了更改,则需要对所有的微服务进行更改。如果发生这种情况,您将需要修改您的库和/或将一些代码提取回原始微服务。
使用restapi直接从ms1调用ms2可以通过命令或查询方法完成(请阅读此答案以了解有关微服务之间通信方式的解释)。从一个微服务调用另一个微服务并没有错,在某些情况下,你别无选择。请记住,在调用另一个api进行验证时会有一些延迟。
结论
我强烈建议您使用1。选项并将验证逻辑从ms2复制到ms1。验证是域逻辑的一部分,应该在您拥有逻辑的同一个微服务中。这种或类似的验证逻辑可能适用于其他微服务,但每个微服务都应该有自己的实现。选择2。主要用于一些与业务无关的事情,如公共测试基础设施、公共数据库访问(存储库类)、公共通信机制等等。选项3。如果你想打电话给其他微服务来获取一些信息或者发送一些命令,比如(为我保留这个产品或者类似的产品),那就更好了,但是为了进行验证,我会避免这样做。绝对需要一个额外的网络调用来进行验证。

相关问题