Apache Kafka - 分区

Apache Kafka - Partition

我已经在 kafka 上工作了六个月,我对消费者滞后和存储到主题分区的数据有一些疑问。

问题编号 1: 最初,当我开始阅读有关 kafka 的内容并了解如何使用该功能时,我一直在不断地学习,一个包含一个部分和一个复制因子的主题会产生奇迹。经过六个月的工作,将我的项目转移到生活中,消费我来自主题的消息的消费者开始给我带来滞后。我阅读了许多有关消费者滞后的堆栈溢出答案,并得出结论,如果我增加我的分区和主题的复制因子将删除它。我真正想知道的是,在六个月的数据流向某个主题之后,这是否真的会消除我的消费者滞后,有人可以帮助我消除我的经纪人中的这种滞后。提前致谢。

问题2: 例如,如果我增加一个主题的部分和复制因子,那么从现在开始,我的生产者将如何将数据放入主题,在它是一个分区之前,数据将同样泛滥,而我的消费者组只有一个消费者,这是默认的消费者,它只会从一个分区中获取。我的数据将分布在主题的分区中(即)一个部分中的第一条消息和另一个分区中的下一条消息。还有一件事我需要在消费者方面进行任何更改,就像许多消费者一样,我必须开始从主题中读取数据,以便我遵循顺序(即)我必须按照我发布到主题的顺序获取数据...

如果有人能对我面临的两个问题给出明确的解决方案就好了。提前致谢。

如果您的消费者滞后,那么您生成(推送)主题的速度比您阅读的速度快。增加分区数可帮助您 运行 并行使用多个消费者。例如,如果您有 16 个分区和 4 个消费者(具有相同的组 ID),那么每个消费者将读取 4 个分区。减少一个消费者应该处理的数据量(在最好的情况下是 4 次)。

向kafka推送消息时,可以指定key。基于该密钥,kafka 消费者决定消息应该发送到哪个分区。

return Utils.abs(Utils.murmur2(record.key())) % numPartitions;

如果您不指定键,消息将平均分布在所有分区中。因此,如果您需要有顺序(例如每个用户),您可以将键设置为用户 ID。在那种情况下,一个用户的所有消息将始终在一个分区中,并按照您推送它们的顺序。