繁体   English   中英

在 Kafka 中有单个分区时是否存在可伸缩性问题?

[英]Are there scalability problems when having single partitions in Kafka?

如果我有一个在 kafka 主题上发布事件的应用程序,并且我的消费者需要按照发布的顺序读取数据,那么我的主题只能有一个分区,因为 kafka 保证只在分区内排序。

但是,我读到 kafka 使用分区来提供可伸缩性,即通过将一个主题的分区放置在多个代理上。 我还读到,分区本身不能拆分。

由于只能在分区内进行排序,因此可扩展性对我的应用程序来说是个问题吗? 有没有办法处理这个问题还是我对卡夫卡的理解不对?

想象一下我的应用程序有成千上万的消费者(每个消费者都在一个组中,所以每个人都消费已发布的事件)。 所有人都需要从具有该单个分区的单个主题读取数据。

编辑:我想到的另一件事是:想象一下该主题有 5 个分区,并且所有消费者仍必须阅读正确的顺序。 如果发布者不指定分区 id 或键,那么 kafka 将在 5 个分区上循环发布信息,对吗?

如果所有消费者都在一个组中并且都订阅了该主题,那么每个消费者都会读取所有主题的事件,这意味着他们仍然会收到订购的消息,对吗?

要点 1)如果您的要求是仅按顺序处理所有记录,那么使用并行处理是不可能的,因为并行处理无法保证顺序。

Point 2) Yes in kafka sequence 只能保证所有记录都使用相同的密钥发送。 因此,如果可以在您真正需要序列处理的地方分离相关数据,那么分析数据。 并仅发送具有相同密钥的那些相关数据。 并用另一个密钥发送其他相关数据。

第 3 点)现在,如果您能够使用不同的键来隔离数据,那么您将不得不增加分区数。 以及相应的消费者。 因此,例如,您有 3 个分区,而您可以使用 3 个消费者扩展您的应用程序。 (请注意,您正在生成带有要遵守排序的密钥的记录)。 所有 3 个消费者分配 1 个分区,您的并行处理将实现。 (这只会保证按具有相同密钥的记录顺序进行处理)。

第 4 点)

想象一下我的应用程序有成千上万的消费者(每个消费者都在一个组中,所以每个人都消费已发布的事件)。 所有人都需要从具有该单个分区的单个主题读取数据。

如果您的所有(数千)消费者在同一组中阅读并从单个分区主题读取,那么只有一个消费者将被分配一个分区,而 rest 所有(数千 - 1)消费者将无所事事。

如果您将不同的组分配给所有消费者,那么所有消费者都将分配有该单个分区主题,并且所有消费者单独处理所有记录,因此将进行重复处理。

第5点)

如果所有消费者都在一个组中并且都订阅了该主题,那么每个消费者都会读取所有主题的事件,这意味着他们仍然会收到订购的消息,对吗?

不,如第 4 点所述)它不能保证所有记录在由不同的消费者处理时都是有序的。

摘要:如果您可以收集记录并使用相同的密钥将其发送到您实际需要排序的地方,那么这将保证排序。 如果你的需求是只顺序消费所有的记录,那么它的问题就是只顺序处理,这里无法实现并行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM