卡夫卡消费者群集环境抵消

时间:2016-12-06 20:25:05

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

我正在尝试让x个消费者访问kafka中的指定主题但不消耗相同的消息。我想要例如......

消费者1获得抵消1 消费者2获得抵消2 消费者1获得抵消3 消费者2拾取抵消4

我希望kafka充当这两个消费者的队列。我注意到了group.id配置,我认为你可以使用相同的组,它会相应地处理它,但它似乎不像我想象的那样工作。

以下是我正在使用的代码......

     public void init(){
            Properties props = new Properties();
            props.put("bootstrap.servers", kafkaUrl);
            props.put("key.deserializer", StringDeserializer.class.getName());
            props.put("value.deserializer", StringDeserializer.class.getName());
            props.put("enable.auto.commit", "true");
            props.put("group.id", "group1");
            props.put("client.id", "KafkaConsumer-" + InetAddress.getLocalHost().getHostAddress());

            consumer = new KafkaConsumer<>(props);
            consumer.subscribe(Arrays.asList("event1", "event2"));

            Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(this::pollTopics, 1, 10, TimeUnit.SECONDS);
     }

     public void pollTopics() {
        try {
            ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);

            for (ConsumerRecord<String, String> record : records) {
                AbstractProcessor processor = Processor.getProcessor(record.value(), record.topic(), mqttMapping, crudRepositoryStore);
                if(processor != null) {
                    kafkaThreadPool.execute(processor);
                }
            }
        }catch (Exception e){
            LOG.error("Polling exception occurred", e);
        }
    }

我希望能够在集群环境中运行此代码并将kafka作为队列。我想让它拉出消息并同时转到下一个偏移量,然后下一个kafka轮询将获取下一个偏移量。这可能吗?如果是这样,我做错了什么?

1 个答案:

答案 0 :(得分:1)

这在Kafka中是不可能的(以你描述它的方式)。

如果使用使用者组,则只能由单个使用者读取单个分区。因此,Kafka确实按分区扩展,即,如果您想拥有多个消费者(读取不同的数据),则每个消费者至少需要一个分区。如果您有比消费者更多的分区,则一些(或所有)消费者将同时读取多个分区。

您的解决方案是,创建一个包含多个分区的主题(或使用多个主题,让您组中的所有消费者订阅主题)。