使用自动提交时的消费者重新平衡

时间:2018-02-11 16:56:38

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

我们正在使用具有以下配置的消费者kafka客户端0.10.2.0:

    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
    props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
    props.put(ConsumerConfig.RECEIVE_BUFFER_CONFIG, 64 * 1024);
    props.put(ConsumerConfig.MAX_PARTITION_FETCH_BYTES_CONFIG, 16 * 1024);
    props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RoundRobinAssignor.class.getName());
    props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");
    props.put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, "40000");
    props.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, "10000");
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "100");

因此,您可以看到我们正在使用自动提交。 我们正在使用的消费者API版本具有用于执行自动提交的专用线程。 所以每一秒我们都有一个自动提交,这意味着我们每秒都有一个心跳。

我们的申请处理时间实际上可能需要(不时)超过40秒(请求超时间隔)

我想问的是:

1 - 如果处理时间需要,例如,一分钟。虽然每秒都有自动提交的心脏,但是会有重新平衡吗?

2 - 更奇怪的是,如果执行时间过长,我们似乎不止一次地获得相同的消息。这是正常的吗?如果消费者提交了偏移量,为什么重新平衡会再次使用相同的偏移量?

谢谢, 奥勒尔

3 个答案:

答案 0 :(得分:0)

为了澄清一下,在每次轮询中都会调用AutoCommit检查,它会检查经过的时间是否大于配置的时间,如果是,那么只有它执行提交

EG。如果提交间隔为5秒,并且轮询在7秒内发生,则在这种情况下,提交将在7秒后发生

提出问题

  1. 自动提交不计入心跳,如果处理时间很长,那么显然提交不会发生并导致会话超时,从而导致重新平衡

  2. 除非您正在寻找/重置之前承诺的偏移量或消费者重新平衡发生,否则不会发生这种情况

答案 1 :(得分:0)

从Kafka v0.10.1.0开始,您无需手动触发自动提交即可进行心跳。 Kafka消费者本身在背景中启动心跳机制的新线程。要了解更多信息,请阅读KIP-62

在您的情况下,您可以将max.poll.interval.ms设置为处理器处理max.poll.record记录所花费的最长时间。

答案 2 :(得分:0)

您可以使用KafkaConsumer.pause() / KafkaConsumer.resume()来防止消费者在长时间处理暂停期间重新平衡。 JavaDocs。看看this问题。

Re.2。你确定要提交这些补偿吗?