我们正在使用具有以下配置的消费者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 - 更奇怪的是,如果执行时间过长,我们似乎不止一次地获得相同的消息。这是正常的吗?如果消费者提交了偏移量,为什么重新平衡会再次使用相同的偏移量?
谢谢, 奥勒尔
答案 0 :(得分:0)
为了澄清一下,在每次轮询中都会调用AutoCommit检查,它会检查经过的时间是否大于配置的时间,如果是,那么只有它执行提交
EG。如果提交间隔为5秒,并且轮询在7秒内发生,则在这种情况下,提交将在7秒后发生
提出问题
自动提交不计入心跳,如果处理时间很长,那么显然提交不会发生并导致会话超时,从而导致重新平衡
除非您正在寻找/重置之前承诺的偏移量或消费者重新平衡发生,否则不会发生这种情况
答案 1 :(得分:0)
从Kafka v0.10.1.0开始,您无需手动触发自动提交即可进行心跳。 Kafka消费者本身在背景中启动心跳机制的新线程。要了解更多信息,请阅读KIP-62。
在您的情况下,您可以将max.poll.interval.ms
设置为处理器处理max.poll.record
记录所花费的最长时间。
答案 2 :(得分:0)