Kafka 是不是支持请求响应消息传递

Posted

技术标签:

【中文标题】Kafka 是不是支持请求响应消息传递【英文标题】:Does Kafka support request response messagingKafka 是否支持请求响应消息传递 【发布时间】:2016-06-02 19:48:31 【问题描述】:

我正在研究 Kafka 9 作为一个爱好项目,并完成了一些“Hello World”类型的示例。

我不得不考虑基于请求响应消息的真实世界 Kafka 应用程序,更具体地说,如何将 Kafka 请求消息链接到其响应消息。

我正在考虑使用生成的 UUID 作为请求消息键并将此请求 UUID 作为关联的响应消息键。与 WebSphere MQ 具有消息关联 ID 的机制类型非常相似。

我的 end 2 end 过程是。

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

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

我是否尝试将 Kafka 应用到它从未设计过的用例中?

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

【问题讨论】:

【参考方案1】:

尽管 Kafka 提供了方便的方法来为给定的消费者组保存已提交的偏移量,但您不需要使用该行为,如果您觉得需要,可以编写自己的行为。即便如此,按照您描述的方式使用 Kafka 对于用例来说还是有点尴尬,因为每个客户端都需要重复搜索主题以获取特定响应。这充其量是低效的。

您可以将问题分为两部分,继续使用 Kafka 向您的服务器传递请求和来自服务器的响应。您需要添加的唯一部分是您的客户与之交谈的某种 API 层,它封装了来自您的客户的特定于 Kafka 的逻辑。该层需要一个本地数据库(关系型或 NoSQL),该数据库可以通过 uuid 存储响应,从而使 API 可以非常快速和轻松地回答响应是否可用于特定 uuid。

【讨论】:

这几乎违背了最初使用 Kafka 的目的,并且引入了一个额外的需要维护的移动部分。我建议,生产者向 Zookeeper 请求一个独占分区(或主题+分区)并将其与生产者中的请求一起传递。处理程序看到要使用的(主题+)分区并在那里发送响应。返回后,释放 Zk 锁。【参考方案2】:

更简单!您只能在 zookeeper 上写下 UUID X 应该在分区 Y 上得到响应,并让发送该 UUID 的生产者使用分区 Y... 这有意义吗?

【讨论】:

您能否提供一个示例来说明您如何做到这一点?【参考方案3】:

我认为您需要一个定义良好的用于调用请求的服务的分片键。您的请求应包含此分片键和发布响应的主题名称。此外,您应该创建某种状态机,当有关您的任务的消息出现时,您将转换到某种状态......这将用于严格的异步设计

【讨论】:

【参考方案4】:

理论上可以

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

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

【讨论】:

当然,在生产者身上,你会有一个以 uuid 作为键的哈希值,你可以用它来回答请求作为值...... 这有意义吗? 你的答案需要重写,第一句话几乎没有任何意义:-/ 按照我的理解,我重写了这个想法以使其有意义。

以上是关于Kafka 是不是支持请求响应消息传递的主要内容,如果未能解决你的问题,请参考以下文章

kafka传递消息的三种方式

消息传递协议

如何检查消息是不是传递到任何单个队列

专为实时而构建:使用Apache Kafka进行大数据消息传递,第1部分

实时构建:Apache Kafka的大数据消息传递,Part 1

微服务是不是可以结合 REST 和消息传递?