我在同一组中有3个消费者,我调用seek()来设置一个消费者的一个分区的偏移量。是否会为组中的所有使用者设置偏移量,或者仅为该特定分区上的偏移量设置偏移量。
我希望能够重置组以重新开始日志中的所有记录。但我只会打电话给一个消费者。
答案 0 :(得分:2)
seek()将仅回退到该分区中的指定偏移量。 然而,对于旧的高级消费者api,没有办法做到这一点。 但是在调用方法
public void seek(TopicPartition partition,
long offset);
它将回退以在提供的TopicPartition的分区和主题中进行偏移。
如果要重置组消耗,则必须使用每个分区的偏移量进行搜索调用TopicPartition。
或者您可以使用offsetsForTimes并调用组分区,如下所示:
Map<TopicPartition, Long> query = new HashMap<>();
query.put(new TopicPartition("topic-name", 0),Instant.now().minus(10, MINUTES).toEpochMilli());
Map<TopicPartition, OffsetAndTimestamp> result = consumer.offsetsForTimes(query);
result.entrySet().stream().forEach(entry -> consumer.seek(entry.getKey(), entry.getValue().offset()));
如果您使用较旧的高级消费者,目前没有api可以重置消费者的偏移量。唯一的方法是停止所有消费者并手动重置ZK中该消费者组的抵消。
但是,在0.11.0版本中,添加了一个工具来重置具有不同范围(如主题,分区等)的组的偏移。 你可以在这里找到详细信息: https://cwiki.apache.org/confluence/display/KAFKA/KIP-122%3A+Add+Reset+Consumer+Group+Offsets+tooling。和 https://issues.apache.org/jira/browse/KAFKA-4743
答案 1 :(得分:1)
在同一组中有3个消费者意味着只为这些消费者中的一个分配了一个分区,所以当你调用seek时,它只对那个只有一个消费者的分区产生影响,所以其他消费者不受影响