Kafka是否支持请求响应式消息传递?

31

我正在把Kafka 9作为一个兴趣项目来研究,并完成了一些"Hello World"类型的示例。

我开始思考基于请求响应消息的真实世界Kafka应用程序,特别是如何将Kafka请求消息链接到其响应消息。

我的想法是使用生成的UUID作为请求消息键,并将此请求UUID作为关联响应消息键。这与WebSphere MQ具有消息关联ID的机制非常相似。

我的端到端流程如下:

1). Kafka客户端生成随机UUID并发送单个Kafka请求消息。 2). 服务器将消耗此请求消息提取和存储请求UUID值 3). 使用消息有效负载完成业务流程。 4). 使用来自请求消息的存储UUID值作为响应消息键响应。 5). Kafka客户端轮询响应主题,直到超时或检索具有原始请求UUID值的消息。

我担心的是,Kafka消费者轮询将从响应主题删除其他客户端的消息,并增加偏移量,使其他客户端失败。

我是否在尝试将Kafka应用于其从未设计的用例中?

是否可能在Kafka中实现请求/响应消息传递?

4个回答

12
尽管Kafka提供了方便的方法来为给定的消费者组持久化提交的偏移量,但如果您感觉有需要,不一定非要使用该行为,可以自己编写。即使如此,按照您描述的方式使用Kafka对于该用例而言有些笨拙,因为每个客户端都需要反复搜索特定响应的主题,这最多是低效的。
您可以将问题分成两部分,继续使用Kafka来传递请求和响应至您的服务器。唯一需要添加的部分是某种API层,您的客户端与之通信并将Kafka特定逻辑封装起来。该层需要一个本地数据库(关系型或NoSQL),可以按uuid存储响应,使得API能够轻松快速地回答是否对于特定uuid有响应可用。

2
这几乎完全违背了使用Kafka的初衷,并引入了一个需要维护的额外移动部件。我建议,生产者向Zookeeper请求独占分区(或主题+分区),并将其与生产者请求一起传递。处理程序查看要使用的(主题+)分区并将响应发送到那里。返回后,释放Zk锁定。 - Niclas Hedhman

1
更简单了!您只需在zookeeper上写入UUID X应该在分区Y上得到响应的信息,然后让发送该UUID的生产者消费分区Y...这样说清楚了吗?

1
你能提供一个如何实现这个的例子吗? - robjwilkins

0

我认为你需要一个明确定义的碎片键来调用服务。你的请求应该包含这个碎片键和发布响应的主题名称。此外,你应该创建某种状态机制,当涉及到你的任务的消息时,你可以转换到某个状态......这将是为了严格的异步设计。


0

理论上,您可以

  1. 为每个请求和消息分配一个ID,该ID应该获得结果消息;
  2. 创建一个哈希函数,将此ID映射到分区的标识符,
  3. 在发送结果消息时,使用相同的哈希函数获取要发送到的分区的标识符,
  4. 在生产者中,您只能观察给定的分区。

这将减少在该主题中爬行许多消息以过滤等待请求处理程序所需的结果的需要。


当然,在生产者端,您将拥有一个哈希表,其中UUID作为键,而可以用作响应值的某些内容作为值... - SmokeMachine
这是否有意义? - SmokeMachine
1
您的答案需要重新编写,第一句话几乎没有意义 :-/ - m-ric
我重新构思了这个想法,使其更有意义,因为我理解了它。 - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接