我正在运行一个包含三个子拓扑的kafka streams应用程序。活动阶段大致如下:
-
stream
主题A
-
selectKey
和重新划分主题A
to
专题B
-
流动
专题B
-
foreach
专题B至专题C
Producer
-
流动
专题C
-
专题C
到
专题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的比率,如何确保每个线程都分配了自己的主题分区,并且一些线程没有空闲?