【问题标题】:apache- kafka with 100 millions of topicsapache-kafka 拥有 1 亿个主题
【发布时间】:2016-11-06 21:23:14
【问题描述】:

我正在尝试用 apache-kafka 替换 rabbit mq,在规划时,我遇到了几个概念规划问题。

首先,我们为每个用户队列策略使用 rabbit mq,这意味着每个用户使用一个队列。这符合我们的需要,因为每个用户都代表要与该特定用户完成的一些工作,并且如果该用户导致问题,则队列将永远不会与其他用户发生问题,因为队列是分开的(问题意味着队列中的消息将被分派给使用http请求的用户。如果用户拒绝接收消息(服务器可能宕机?),它将返回重试队列,这不会导致消息丢失(除非队列宕机))

现在 kafka 具有容错性和故障安全性,因为它写入磁盘。 这正是我尝试在我们的结构中实施 kafka 的原因。

但我的计划有问题。

首先,我想为每个用户创建尽可能多的主题,这意味着每个用户都会拥有每个主题(这会导致什么问题?我的最大估计是我将拥有大约 1~5 百万个主题)

其次,如果我决定根据用户id的随机哈希进行操作和分区的主题,如果一个用户当前没有消费消息的问题,分区中的所有用户都必须等待吗?构建这种情况的最佳方法是什么?

因此,作为结论,1~5 百万用户。我们不希望一个用户阻止大量其他正在处理的用户。每个用户拥有一个主题将解决这个问题,如果有这么大的数量进入,zookeeper 似乎可能会出现问题(这是真的吗?)

结构化的最佳解决方案是什么?考虑可扩展性?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api kafka-producer-api


    【解决方案1】:

    首先,我想为每个用户创建尽可能多的主题,这意味着每个用户都会拥有每个主题(这会导致什么问题?我的最大估计是我将拥有大约 1~5 百万个主题)

    我建议不要进行这样的建模。

    谷歌搜索“kafka topic limits”,你会发现这个主题的相关注意事项。我想你会发现你不想制作数百万个主题。

    其次,如果我决定根据用户 id 的随机散列进行操作和分区来选择主题

    是的,为这些消息设置一个主题,然后根据相关字段路由这些消息,例如 user_idconversation_id。该字段可以作为消息中的字段出现,并用作ProducerRecord key,用于确定该消息的目的地是主题中的哪个分区。我不会将操作包含在主题名称中,而是包含在消息本身中。

    如果有一个用户当前没有消费消息的问题,分区中的所有用户都必须等待吗?构建这种情况的最佳方法是什么?

    这取决于用户如何使用消息。您可以设置一个超时时间,然后将消息路由到某个“失败”主题。或者以 UDP 样式向用户发送消息,无需确认。有很多方法可以对此进行建模,如果不知道您的消费者如何将消息转发给您的客户,就很难提供建议。


    另外,如果您使用的是 Kafka Streams,请记下 StreamPartitioner 接口。此接口出现在 KStreamKTable 方法中,它们将消息具体化到一个主题,并且在您有客户端空闲在特定 TCP 连接上的聊天应用程序中可能很有用。

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多