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

时间:2018-04-23 17:39:53

标签: apache-kafka kafka-consumer-api producer-consumer

举个例子,假设我有一个包含4个分区的主题。我向这个主题发送4k消息。每个分区获得1k个消息。由于外部因素,3个消费者分别处理他们所有1k的消息。但是,第4个分区只能通过200条消息,剩下800条消息要处理。是否有一种机制允许我“重新平衡”主题中的数据,以便给分区4的分区1-3 200数据留下所有分区有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"
      ]
    }
  ]
}

建议的分区重新分配配置

{
  "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"
      ]
    }
  ]
}

2 个答案:

答案 0 :(得分:3)

生成消息时分配分区。它们永远不会在分区之间自动移动。通常,对于每个分区,可以有多个消费者(具有不同的消费者组ID)以不同的速度消费,因此代理不能基于消费者(组)的慢度在分区之间移动消息。你可以尝试一些事情:

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

答案 1 :(得分:0)

您可以采取一些措施来提高绩效

  • 增加分区数
  • 增加使用分区的使用者组。

第一个将重新平衡分区上的负载,第二个将增加分区上的并行性以快速使用消息。

我希望这会有所帮助。您可以参考此链接以获得更多理解

https://xyu.io/2016/02/29/balancing-kafka-on-jbod/

Kafka消费者是消费者群体的一部分。一个组中有一个或多个消费者。每个分区都分配给一个使用者。

如果您拥有的消费者多于分区,那么您的一些消费者将无所事事。如果您拥有的分区多于使用者,则可能会将多个分区分配给单个使用者。

每当新的消费者加入时,都会启动重新平衡,并为新的消费者分配一些先前分配给其他消费者的分区。

例如,如果一个消费者正在消费20个分区,而另一个消费者加入,那么将会重新平衡。

在重新平衡期间,消费者群体会暂停"。