我正在尝试处理有两个或更多消费者的情况,听一个只包含一个分区的常见主题。我暂停其中一位消费者,在此期间,其他没有暂停的消费者应该能够从主题中获取消息。 我发现,只有当暂停的消费者恢复时,只有其他一个活跃的消费者才能收到消息。 我怎样才能通过春天kakfka实现这一目标。我正在使用Spring kafka 2.0.0.M2。
以下是我的代码行
public class listener{
@KafkaListener(id = "id2", topics = "abcd", group = "group1", containerFactory = "kafkaListenerContainerFactory")
public void listenPartition1(String data, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions, @Header(KafkaHeaders.OFFSET) Long offsets, Acknowledgment acknowledgment, Consumer consumer) throws InterruptedException {
count_consumer2 = count_consumer2 + 1;
if(count_consumer2 == 10) {
consumer.pause(consumer.assignment());
}
acknowledgment.acknowledge();
}
@KafkaListener(id = "id1", topics = "abcd", group = "group1", containerFactory = "kafkaListenerContainerFactory")
public void listenPartition1(String data, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions, @Header(KafkaHeaders.OFFSET) Long offsets, Acknowledgment acknowledgment, Consumer consumer) throws InterruptedException {
count_consumer1 = count_consumer1 + 1;
if(count_consumer1 == 5) {
consumer.pause(consumer.assignment());
while(data.database <10){
consumer.resume(consumer.assignment());
}
}
acknowledgment.acknowledge();
}
}
答案 0 :(得分:2)
签出pause()方法docs:
暂停从请求的分区中获取。将来调用poll(long)将不会从这些分区返回任何记录,直到它们使用resume(Collection)恢复。
请注意,此方法不会影响分区订阅。特别是,当使用自动分配时,它不会导致组重新平衡。
pause方法不会触发分区重新平衡,因此该组中的其他使用者不会使用此分区,并注意一个分区将仅由同一个使用者组中的一个使用者使用。所以在您的情况下,只需一个消费者工作,其他人闲置。
答案 1 :(得分:0)
您应该重新分配您的主题,以至少拥有与拥有活动的互斥使用者一样多的分区(即,相同的group.id)。这就是Kafka的设计工作方式。