繁体   English   中英

从 Kafka 主题获取多条消息

[英]Get multiple messages from Kafka topic

我的用例就像从生产者端它将一行数据(大约 100 个字节)作为一条消息发布到 kafka 主题,从消费者端我想一次消费 5 条消息并将其提供给我的消费者逻辑。

@KafkaListener(id = "listener-batch", topics = "test", containerFactory = "concurrentKafkaListenerContainerFactory")
public void receive(@Payload List<String> messages,
                    @Header(KafkaHeaders.RECEIVED_PARTITION_ID) List<Integer> partitions,
                    @Header(KafkaHeaders.OFFSET) List<Long> offsets) {

    System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
    System.out.println("Starting the process to recieve batch messages :: " + messages);
    for (int i = 0; i < messages.size(); i++) {
        System.out.println("received message= "+ messages.get(i) +" with partition-offset= " + partitions.get(i) + "-" + offsets.get(i));
    }
    System.out.println("all the batch messages are consumed");
}

我做了一个示例,它总是收到一条消息并在控制台中打印。 请向我建议实现这一目标所需的任何配置更改。

请在下面找到源代码。

@EnableKafka
@Configuration
public class KafkaConfig {

@Bean
public ConsumerFactory<String, String> consumerFactory(){
    Map<String, Object> config = new HashMap<>();
    config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    config.put(ConsumerConfig.GROUP_ID_CONFIG, "batch");
    config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);
    config.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, "5");
    return new DefaultKafkaConsumerFactory<>(config);
}

@Bean
public ConcurrentKafkaListenerContainerFactory concurrentKafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setBatchListener(true);
    return factory;
}
}

使用以下命令启动生产者

./kafka-producer-perf-test --num-records 500 --topic test --throughput 10 --payload-file test.csv --producer-props bootstrap.servers=localhost:9092 key.serializer=org.apache .kafka.common.serialization.StringSerializer value.serializer=org.apache.kafka.common.serialization.StringSerializer

test.csv 文件内容

Batch-1 message
Batch-2 message
Batch-3 message
Batch-4 message
Batch-5 message
Batch-6 message
Batch-7 message
Batch-8 message
Batch-9 message
Batch-10 message
Batch-11 message

输出如下所示。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Starting the process to recieve batch messages :: [Batch-3 message]
received message= Batch-3 message with partition-offset= 0-839501
all the batch messages are consumed
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Starting the process to recieve batch messages :: [Batch-7 message]
received message= Batch-7 message with partition-offset= 0-839502
all the batch messages are consumed
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Starting the process to recieve batch messages :: [Batch-3 message]
received message= Batch-3 message with partition-offset= 0-839503
all the batch messages are consumed
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Starting the process to recieve batch messages :: [Batch-1 message]
received message= Batch-1 message with partition-offset= 0-839504
all the batch messages are consumed
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

提前致谢。

您应该配置一个Batch Listener ,然后您可以设置max.poll.records属性来指定您的批量大小。

请注意,将此值设置得太低可能会降低整体性能,因为您需要对代理进行更多轮询以获取相同数量的记录。

这里提供的要求非常高。 如果您能从业务逻辑实现的角度告诉我们您的实际需求,那就太好了。 您的低级编码和其他配置参数可以根据您的要求进行微调。

为了给您一个建议,如果您只想将消息(5)一个一个地控制台出来,那么您可以通过 max.poll.records = 5 一次轮询 5 条记录并遍历消费者记录。 这很简单。

Venkata Krishna,这只能通过使用在生产者端实现的键控机制来完成。 从源系统生成的每一行输入都必须具有与之关联的唯一键,并使用更好的分区策略将事件发布到具有唯一键的特定分区中。 根据唯一键,您可以使用可用的全状态操作之一或使用窗口聚合之一对它们进行分组。 因此,如果您使用窗口,您可以实现类似的东西,在给定的持续时间内对每个键接收的事件进行分组,并将它们全部发布到一个中间主题,并让您的消费者轮询 <> 个记录并遍历消费者记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM