首页 > 解决方案 > Kafka Broker 和 Consumer 优化

问题描述

我们有 2500 万条记录写入 Kafka 主题。

  1. 该主题有 24 个分区和 24 个消费者。
  2. 每条消息为 1KB。并且这些消息用 Avro 包装起来进行序列化和反序列化。
  3. 复制因子为 2。
  4. 获取大小为 50000,轮询间隔为 50 毫秒。

目前在负载测试期间消耗和处理 100 万,平均需要 40 分钟。但是,我们希望在 20 到 30 分钟内处理 2500 万条记录。

经纪人配置:

background.threads = 10
num.network.threads = 7
num.io.threads = 8
Set replica.lag.time.max.ms  = 500
Set replica.lag.max.messages = 4
Set log.flush.interval.ms to default value as per logs
Used G1 collector instead of MarkSweepGC
Changed Xms to 4G and Xmx to 4G

我们的设置有 8 个代理,每个代理有 3 个磁盘和 10GBPS 以太网和单工网络。

消费者配置:

我们正在使用 Java Consumer API 来消费消息。我们将 swappiness 设为 1 并使用 200 个线程来处理消费者内部的数据。在消费者内部,我们正在接收消息并点击 Redis、MaprDB 以执行一些业务逻辑。一旦逻辑完成,我们将使用 Kafka Commit Sync 提交消息。

每个使用者都使用 -xms 4G 和 -xmx 4G 运行。为了提高读取吞吐量,我们还需要考虑哪些其他方面?

标签: apache-kafka

解决方案


我不会为您提供问题的确切答案,而是提供路线图和方法帮助。

如果一切正常并且消费者的任务很轻,100 万条消息的 10 分钟确实很慢。

你需要知道的第一件事是你的瓶颈是什么。

它可能是:

  • Kafka 集群本身:消息很长时间要从集群中拉出。T 测试,您应该检查一个简单的消费者(例如随 Kafka CLI 提供的消费者),直接在您有代理(或关闭)的机器上运行,以避免网络延迟。那有多快?

  • 经纪人和消费者之间的网络

  • 消费者:它是做什么的?也许处理真的很长。然后优化应该在那里运行。您能否监控消费者所需的资源(CPU、RAM)?也许您可以做的一个很好的测试是创建一个测试使用者,在其中您在内存中加载 10k 条消息,然后执行您的业务逻辑并对其计时。持续多久?这将告诉您消费者的最大吞吐量,而与 Kafka 的速度无关。


推荐阅读