由于消费者较慢,Kafka 重新平衡主题中的数据

Kev*_*sko 3 producer-consumer apache-kafka kafka-consumer-api

例如,假设我有一个包含 4 个分区的主题。我向这个主题发送了 4k 条消息。每个分区获得 1k 条消息。由于外部因素,其中 3 个消费者分别处理了所有 1k 条消息。但是,第 4 个分区只能通过 200 条消息,还剩下 800 条消息需要处理。有没有一种机制可以让我“重新平衡”主题中的数据,说给分区 1-3 200 的分区 4s 数据,让所有带有 200 条消息的分区成为一个进程?

我不是在寻找一种向消费者组添加额外节点并让 kafka 平衡分区的方法。

添加了重新分配分区的输出:

当前分区副本分配

{
  "version": 1,
  "partitions": [
    {
      "topic": "MyTopic",
      "partition": 0,
      "replicas": [
        0
      ],
      "log_\ndirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 1,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 4,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 3,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "p\nartition": 2,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 5,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

建议的分区重新分配配置

{
  "version": 1,
  "partitions": [
    {
      "topic": "MyTopic",
      "partition": 3,
      "replicas": [
        0
      ],
      "log_ dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 0,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 5,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 2,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "p artition": 4,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    },
    {
      "topic": "MyTopic",
      "partition": 1,
      "replicas": [
        0
      ],
      "log_dirs": [
        "any"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*cki 5

产生消息时分配分区。它们永远不会在分区之间自动移动。通常,对于每个分区,可以有多个消费者(具有不同的消费者组 ID)以不同的速度消费,因此代理无法根据消费者(组)的速度在分区之间移动消息。不过,您可以尝试以下几件事:

  • 更多分区,希望负载分配更公平(您可以拥有比消费者更多的分区)
  • 让生产者在每条消息上明确设置分区,以在分区之间产生一个消费者可以更好地应对的分布
  • 让消费者监控他们的延迟并在他们落后时主动取消订阅分区,以便让其他消费者接手。

  • @Michal 您能否详细说明第三点,如何实现? (2认同)