我想描述以下情况: 我有一个node.js后端应用程序(它使用一个单线程事件循环)。 这是系统的一般架构: 生产者-> Kafka->消费者->数据库
假设生产者向Kafka发送了一条消息,该消息的目的是在数据库中进行特定查询并检索查询结果。 但是,众所周知,Kafka是一个异步系统。如果生产者将消息发送到Kafka,它将收到消息,说明该消息已被Kafka经纪人接受。 Kafka经纪人不会等到消费者轮询消息并对其进行处理。
在这种情况下,生产者如何获得对数据库进行操作的查询结果?
答案 0 :(得分:2)
使用Kafka的流程如下所示:
生产者A 知道消费者A 消耗的消息发生了什么的唯一方法是产生另一条消息。将会由任何其他可用的消费者(在这种情况下为消费者B )相应地处理。
您已经提到过,该流程是异步的。当您对查询进行非常繁重的处理(例如生成报告等)时,这很有用,例如第二个生成器将通知用户收件箱。
如果不是这种情况,也许您应该使用HTTP,它是同步的,并且在处理结束时会有响应。
答案 1 :(得分:1)
您必须生成新流程以便传达查询结果:
Consumer (now its a producer) -> Kafka topic -> Producer (now its a consumer)
您应该考虑使用其他同步通信机制,例如HTTP 。