【发布时间】:2018-02-05 02:57:36
【问题描述】:
我正在创建一个系统,其中前端服务将消息推送到 Kafka 的“请求”主题,并为一些下游后端消费者侦听另一个“响应”主题(实际上是一个最终推回 Kafka 的复杂系统)对“请求”消息进行处理并最终推送到“响应”主题。
我试图找出最优雅的方法来确保消费者在适当的分区上监听并接收响应,并且后端推送到前端消费者正在监听的分区。我们始终需要确保响应发送到产生初始消息的同一消费者。
目前我有两种解决方案,但都不是特别令人满意。任何想法或想法将不胜感激:
- 让每个前端决定它将侦听哪个分区并将该分区与消息一起传递给“请求”主题。后端处理完成后,会查看消息的分区成员,并推送到相应的分区。这里的一个直接问题是如何协调前端服务,以便在每个分区上均匀分布(随机分配?)。
- 每条消息都有一个相关 ID,一个 GUID,因此对于我们前端的每个请求,我们可以根据将 GUID 散列到分区总数来开始侦听分区,然后将消息推送到“请求”主题.然后后端将查看相关 ID 以确定要推送到的适当分区。这里的一个问题是,对于每个传入的请求,前端必须在新分区上建立一个新的消费者(这里有开销吗?)并且可能在同一个分区上有多个活动消费者以及跨多个活动消费者许多分区。
- 拥有一个消费者组和分区数量相等的消费者组,然后采用与(1)类似的方法,但允许 Kafka 处理哪个消费者在哪个分区上。但是接下来我们需要弄清楚当重新平衡发生时会发生什么,尤其是对于已经在后端传输的消息(因为所有分区都可能发生变化?)。
这似乎应该是一种常见的模式,所以我想知道其他人是如何解决这个问题的。
【问题讨论】:
标签: apache-kafka kafka-consumer-api kafka-producer-api