代码之家  ›  专栏  ›  技术社区  ›  kellanburket

用多个子拓扑优化kafka流应用程序

  •  0
  • kellanburket  · 技术社区  · 6 年前

    我正在运行一个包含三个子拓扑的kafka streams应用程序。活动阶段大致如下:

    1. stream 主题A
    2. selectKey 和重新划分主题A to 专题B
    3. 流动 专题B
    4. foreach 专题B至专题C Producer
    5. 流动 专题C
    6. 专题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. 多个子拓扑如何能够在一个线程上运行?投票队列?
    2. 每个线程如何决定如何为其每个子拓扑分配计算资源?
    3. 在这种情况下,如何优化线程与主题的分区比率,以避免周期性的使用者故障?例如,1:1的比率能否确保更一致的性能?
    4. 如果使用1:1的比率,如何确保每个线程都分配了自己的主题分区,并且一些线程没有空闲?
    1 回复  |  直到 6 年前
        1
  •  1
  •   Matthias J. Sax    6 年前
    1. 线程将轮询()不同子拓扑的所有主题并检查记录 topic 元数据以将其馈送到正确的任务中。

    2. 每个子拓扑都被处理为相同的,即,如果您愿意,可用的资源是均匀分布的。

    3. 只有当你有足够的核心时,1:1的比率才有用。我建议您监视您的CPU利用率。如果太高(大于80%),则应添加更多核心/线程。

    4. kafka streams会自动为您处理这个问题。

    几点一般性意见:

    • 你可以考虑增加 max.poll.interval.ms 配置以避免用户退出组
    • 你可以考虑减少 max.poll.records 以获得更少的记录 poll() 调用,从而减少两个连续调用之间的时间 投票() 是的。
    • 注意,那 最大投票记录 并不意味着增加了网络/代理通信——如果一个获取请求返回的记录多于 最大投票记录 配置,数据只是缓冲在消费者和下一个 投票() 将从缓冲数据提供服务,避免代理往返