Multithreading 使用多个子拓扑优化Kafka Streams应用程序

Multithreading 使用多个子拓扑优化Kafka Streams应用程序,multithreading,apache-kafka,kafka-producer-api,apache-kafka-streams,Multithreading,Apache Kafka,Kafka Producer Api,Apache Kafka Streams,我正在运行一个带有三个子拓扑的Kafka Streams应用程序。活动的阶段大致如下: 流主题A 选择键并将主题A重新分区到主题B 流主题B foreach主题B到主题CProducer 流主题C 主题C至主题D 主题A、B和C都是具体化的,这意味着如果每个主题有40个分区,那么我的最大并行度是120 起初,我运行5个streams应用程序,每个应用程序有8个线程。在这种设置下,我遇到了性能不一致的问题。似乎共享同一线程的某些子拓扑比其他子拓扑更需要CPU,过了一段时间,我会遇到以下错误:组[c

我正在运行一个带有三个子拓扑的Kafka Streams应用程序。活动的阶段大致如下:

  • 主题A
  • 选择键
    并将主题A
    重新分区到主题B
  • 主题B
  • foreach
    主题B到主题C
    Producer
  • 主题C
  • 主题C
    至主题D
  • 主题A、B和C都是具体化的,这意味着如果每个主题有40个分区,那么我的最大并行度是120

    起初,我运行5个streams应用程序,每个应用程序有8个线程。在这种设置下,我遇到了性能不一致的问题。似乎共享同一线程的某些子拓扑比其他子拓扑更需要CPU,过了一段时间,我会遇到以下错误:
    组[consumer\u group]中的成员[client\u id]失败,将其从组中删除(kafka.coordinator.group.GroupCoordinator)
    。一切都将重新平衡,这可能导致性能下降,直到下一次失败和重新平衡

    我的问题如下:

  • 多个子拓扑如何能够在单个线程上运行?投票队列
  • 每个线程如何决定如何将计算资源分配给其每个子拓扑
  • 在这种情况下,如何优化线程到主题的分区比率,以避免周期性的使用者故障?e、 例如,1:1的比例能确保更一致的性能吗
  • 如果使用1:1的比率,如何确保每个线程都分配了自己的主题分区,并且一些线程没有空闲
  • 线程将轮询()不同子拓扑的所有主题,并检查记录
    topic
    元数据,以将其提供给正确的任务

  • 每个子拓扑都被视为相同的,即,如果您愿意,可用资源将均匀分布

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

  • Kafka Streams会自动为您处理此问题

  • 几点一般性意见:

      您可以考虑增加<代码> Max .Poop.Time.MS。
    • 您可以考虑减少<代码> Max .Poop.Reals<代码>以获得更少的记录,每一个代码> POLL()(代码)>调用,这样就减少了两次连续调用到“代码> PORE())/代码>之间的时间。
    • 请注意,
      max.poll.records
      并不意味着增加网络/代理通信——如果单个提取请求返回的记录多于
      max.poll.records
      config,则数据只是缓冲在使用者中,下一个
      poll()
      将从缓冲数据中提供,从而避免代理往返

    据我所知,
    max.poll.interval.ms
    默认设置为
    Integer.max\u值,大约为25天。我没有在我的配置中设置这个,但是消费者组在25天前就被删除了。这取决于您使用的版本。您可以仔细检查日志中使用的值。re回答4:我发现这并不总是正确的(对于版本1.1)。有时我必须重新启动一个streams应用程序,让所有的线程都可以选择分区,但这可能是另一个问题。