apache- kafka拥有1亿个主题

时间:2016-07-05 06:34:41

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

我正在尝试用apache-kafka取代兔子mq,在计划的时候,我碰到了几个概念规划问题。

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

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

但我的计划有问题。

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

第二,如果我决定通过用户id的随机哈希来寻找基于操作和分区的主题,如果当前一个用户没有消费消息存在问题,那么分区中的所有用户都必须等待吗?构建这种情况的最佳方法是什么?

结论,1~5百万用户。我们不希望有一个用户阻止正在处理的大量其他用户。拥有每个用户的主题将解决这个问题,似乎动物园管理员可能存在一个问题,如果这么大的数字进入(这是真的吗?)

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

1 个答案:

答案 0 :(得分:3)

  

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

我建议不要像这样建模。

谷歌围绕“kafka主题限制”,您将找到该主题的相关注意事项。我想你会发现你不会想要制作数以百万计的话题。

  

第二,如果我决定通过用户id

的随机哈希来寻找基于操作和分区的主题

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

  

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

这取决于用户如何使用消息。您可以设置超时,然后将消息路由到某个“失败”主题。或者以UDP风格向用户发送消息,而不需要ack。有很多方法可以对此进行建模,如果不知道消费者如何向客户转发消息,则很难提供建议。

此外,如果您使用的是Kafka Streams,请记下StreamPartitioner界面。此界面显示在KStreamKTable方法中,这些方法实现了对主题的消息,并且在客户端在特定TCP连接上空闲的聊天应用程序中可能很有用。