当我暂停消费者时,来自同一消费者组的其他消费者应该获取消息

时间:2017-08-02 22:37:00

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

我正在尝试处理有两个或更多消费者的情况,听一个只包含一个分区的常见主题。我暂停其中一位消费者,在此期间,其他没有暂停的消费者应该能够从主题中获取消息。 我发现,只有当暂停的消费者恢复时,只有其他一个活跃的消费者才能收到消息。 我怎样才能通过春天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();



        }
}

2 个答案:

答案 0 :(得分:2)

签出pause()方法docs:

  

暂停从请求的分区中获取。将来调用poll(long)将不会从这些分区返回任何记录,直到它们使用resume(Collection)恢复。

     

请注意,此方法不会影响分区订阅。特别是,当使用自动分配时,它不会导致组重新平衡。

pause方法不会触发分区重新平衡,因此该组中的其他使用者不会使用此分区,并注意一个分区将仅由同一个使用者组中的一个使用者使用。所以在您的情况下,只需一个消费者工作,其他人闲置。

答案 1 :(得分:0)

您应该重新分配您的主题,以至少拥有与拥有活动的互斥使用者一样多的分区(即,相同的group.id)。这就是Kafka的设计工作方式。