卡夫卡的话题非常多?

时间:2018-02-19 19:12:05

标签: apache-kafka

我正在考虑将Kafka从后端流向前端应用程序。 - 数据流特定于用户请求,因此每个请求将在后端生成流。 - 每个用户将有多个并发请求。 btw用户和流的一对多关系

我首先想到我会设置一个主题"每个用户请求"但了解到成千上万的主题因多种原因而不好。

在线阅读,我发现了一些帖子,建议在userid上分区一个主题。这比多个主题更好吗?

如果要在userid上进行分区,那么消费者将收到针对不同请求(来自该用户)的更新,这将导致问题。在我选择之前,我需要能够不处理流,并且如果每个请求都有自己的主题,那么这将很有效。

思想?

2 个答案:

答案 0 :(得分:0)

虽然有可能(我猜)有一个包含多个主题的Kafka群集,但我不确定这是否适合您的具体情况。

通常你围绕数据流设计你的Kafka应用程序:如点击流,页面浏览等。然后,如果你想要某种"粘性"处理器 - 您需要分区密钥。在您的情况下,如果您选择用户ID作为密钥,Kafka会将用户的所有事件存储到相同的分区

另一方面,Kafka消费者从一个主题的所有分区读取消息。这意味着,如果您有一个包含10个分区的主题,则可以在使用者组中启动您的Kafka使用者,以便每个使用者都分配了不同的分区。

这意味着,对于用户ID示例,所有用户将由一个消费者根据密钥进行处理。例如,用户标识A转到分区1,但用户标识B转到分区10。

同样,您可以使用消息密钥将数据流映射到Kafka分区。具有相同密钥的所有事件将存储到同一分区,并由同一个消费者实例使用/处理。

答案 1 :(得分:0)

我不认为Kafka对你的用例来说是个不错的选择。因为你的用例有点"同步"和"动态"在自然界。提交用户请求并且客户端等待响应事件流,客户端还应该知道特定用户请求的响应何时结束。多个用户请求可能最终出现在同一个Kafka分区中,因为当用户数量很高时,我们无法为每个用户提供独占分区。

我猜Redis可能是这个用例的更好用例。每个请求都可以具有唯一的ID,并且响应事件将添加到具有合理到期时间的Redis列表中。 Redis列表的名称与请求ID相同。

Redis列表看起来像(key是请求ID):

请求ID - >响应even1,响应事件2,......,响应结束evnt

将事件中继到客户端的过程将在成功将所有响应事件发送到客户端并且"最后响应事件标记"之后删除列表。遇到了。如果中继过程在可以删除响应之前死亡,Redis将负责在列表的到期时间之后删除列表。