匹配Kafka消费者和生产者分区

时间:2017-08-27 20:00:54

标签: apache-kafka kafka-consumer-api kafka-producer-api

我正在创建一个系统,其中前端服务将消息推送到Kafka'请求'主题和倾听另一个回应'一些下游后端消费者的主题(实际上是一个最终推回Kafka的复杂系统)来对“请求”进行处理。消息,并最终推动回应'主题。

我试图找出最优雅的方法来确保消费者监听适当的分区并接收响应,并且后端推送到前端消费者正在侦听的分区。我们总是需要确保响应发送给产生初始消息的同一个消费者。

到目前为止,我有两个解决方案,但两者都不是特别令人满意。任何想法或想法将不胜感激:

  1. 让每个前端决定它将侦听哪个分区,并将带有该消息的分区传递给'请求'话题。当后端上的处理完成后,它将查看消息的分区成员并推送到适当的分区。这里的一个直接问题是如何协调前端服务,以便在每个分区上进行均匀分配(随机分配?)。
  2. 每条消息都有一个相关ID,一个GUID,因此对于我们前端的每个请求,我们可以基于将GUID散列到分区总数来开始侦听分区,然后将消息推送到'请求'话题。然后,后端将查看相关ID以确定要推送到的适当分区。这里的一个问题是,对于每个进入的请求,前端必须在新分区上建立新的消费者(这里有开销吗?)并且可能在同一分区上有多个活动消费者以及跨越多个活跃消费者很多分区。
  3. 让一个消费者群体具有相同数量的消费者和分区,然后采用与(1)类似的方法,但允许Kafka处理哪个消费者在哪个分区上。但是,我们需要弄清楚重新平衡发生时会发生什么,特别是对于已经在后端发送的消息(因为可能所有分区都可能发生变化?)。
  4. 这似乎应该是一种常见的模式,所以我想知道别人是如何解决这个问题的。

3 个答案:

答案 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(在同一个客户端也是如此)和你在上面定义的相同哈希函数来计算你应该监听的分区号。