我正在创建一个系统,其中前端服务将消息推送到Kafka'请求'主题和倾听另一个回应'一些下游后端消费者的主题(实际上是一个最终推回Kafka的复杂系统)来对“请求”进行处理。消息,并最终推动回应'主题。
我试图找出最优雅的方法来确保消费者监听适当的分区并接收响应,并且后端推送到前端消费者正在侦听的分区。我们总是需要确保响应发送给产生初始消息的同一个消费者。
到目前为止,我有两个解决方案,但两者都不是特别令人满意。任何想法或想法将不胜感激:
这似乎应该是一种常见的模式,所以我想知道别人是如何解决这个问题的。
答案 0 :(得分:4)
请不要将消费者与手动分配的分区一起使用。它可能变得非常混乱,很难扩展。
您可以使用每个前端消费者的主题,而不是分区。每个前端服务都会生成一条消息,其中包含前端服务的request
主题ID。然后,后端使用消息,并根据id生成对特定unique-front-end-service-response
主题的响应消息。
如果您拥有一定数量的前端服务,这可能是一个很好的解决方案。每次要添加新的前端服务时,可能的缺点是创建一个新主题。但是,维护比手动分区分配容易得多。
另一种可能的解决方案可能是使用不同的工具。如果Kafka不是强制性的,请重新考虑您的要求并进行研究。可能有一种工具可以比卡夫卡更好地满足您的需求。
答案 1 :(得分:0)
如果可以通过将Kafka响应消息发送到Kafka连接器直接响应用户请求,则响应有时没有返回原始请求应用程序通过Webhooks,WebSocket,电子邮件或SMS文本消息直接外部传递回原始用户。
如果您只是想要使用SOAP或REST样式RPC,那么只需使用HTTP而不是Kafka,因为这是一种经过验证的模式。
答案 2 :(得分:0)
一种优雅的方式是在后端生产者中使用分区功能,并使用手动分区分配assign
为前端使用者仅监听有趣的分区。
更详细:
在前端制作人中,在制作"请求之前#34;消息到"请求"主题,将消息密钥设置为前端客户端ID(它必须是唯一的)。
在后端使用者中,无需进行手动分区分配,只需使用subscribe
订阅request
主题即可。但值得注意的是,当您收到“请求”时,请注意。消息并处理它,请不要丢失消息密钥,保留它。因为它确定了请求的来源。
在后端生产者中,当您完成请求过程时,您会生成一条回复响应消息,并将响应消息密钥设置为您保留在上面的前端客户端ID。您还需要定义分区函数(散列函数,将客户端ID映射到分区号)。使用分区功能执行send()
。
在前端消费者中,您需要使用assgin()
方法来侦听特定分区。但是如何知道应该监听哪个分区?只需使用它的client-id(在同一个客户端也是如此)和你在上面定义的相同哈希函数来计算你应该监听的分区号。