【发布时间】:2018-07-05 23:19:57
【问题描述】:
我正在运行具有三个子拓扑的 Kafka Streams 应用程序。活动阶段大致如下:
-
stream话题A -
selectKey并重新分区主题 Ato主题 B -
stream话题B -
foreach主题 B 到主题 CProducer -
stream话题C - 话题C
to话题D
主题A、B、C都是物化的,也就是说如果每个主题有40个分区,我的最大并行度是120。
起初我运行 5 个流应用程序,每个应用程序有 8 个线程。通过这种设置,我遇到了不一致的性能。似乎某些共享同一线程的子拓扑比其他子拓扑更渴望 CPU,过了一段时间,我会收到此错误:Member [client_id] in group [consumer_group] has failed, removing it from the group (kafka.coordinator.group.GroupCoordinator)。一切都会重新平衡,这可能会导致性能下降,直到下一次失败并重新平衡。
我的问题如下:
- 如何在一个线程上运行多个子拓扑?投票队列?
- 每个线程如何决定如何将计算资源分配给它的每个子拓扑?
- 在这种情况下,您如何优化线程与主题分区的比率以避免周期性的消费者失败?例如,1:1 的比例能否确保性能更加一致?
- 如果您使用 1:1 的比率,您如何确保每个线程都被分配了自己的主题分区并且某些线程不会闲置?
【问题讨论】:
标签: multithreading apache-kafka kafka-producer-api apache-kafka-streams