1

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

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

由于只能在分区内进行排序,所以可伸缩性对我的应用程序来说是个问题吗?有没有办法解决这个问题还是我对Kafka的理解不对?

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

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

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

4

1 回答 1

1

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

第 2 点) 在 kafka 序列中是的,仅保证所有记录都使用相同的密钥发送。因此,如果可以在您真正需要序列处理的地方分离相关数据,请分析数据。并仅发送具有相同密钥的相关数据。并用另一个密钥发送其他相关数据。

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

第 4 点)

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

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

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

第 5 点)

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

不,如第 4 点所述),它不保证所有记录在被不同消费者处理时都会井然有序。

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

于 2022-02-27T04:27:32.973 回答