27

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

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

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

我的结束 2 结束过程将是。

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

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

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

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

4

4 回答 4

11

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

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

于 2016-02-21T14:23:47.467 回答
1

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

于 2016-06-28T11:46:20.540 回答
0

理论上,你可以

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

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

于 2016-06-26T16:08:07.857 回答
0

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

于 2017-02-14T21:27:39.617 回答