使用Spring Kafka进行Kafka主题排序

时间:2019-01-23 11:57:58

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

我正在尝试建立一个系统,该系统将从两个不同的Kafka主题中读取-一个用于实时消息,另一个用于批量消息。希望是,无论“批量”主题上有多少消息,都将“实时”主题上的任何内容都赋予优先级。

似乎 Spring Kafka有时是开箱即用的。

我得到的只是:

@KafkaListener(topics = {"sync-live", "sync-bulk"}, concurrency = "1")

我的配置是:

@Bean
public ConsumerFactory<String, String> consumerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, consumerGroup);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 1);
    return new DefaultKafkaConsumerFactory<>(props);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {

    ConcurrentKafkaListenerContainerFactory<String, String> factory
        = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    return factory;
}

有时候,这完全可以实现我想要的功能,而有时却不能。实际上,在有些情况下,当仍有实时消息需要处理时,它会从“实时”主题切换为“批量”主题!

有没有办法告诉Spring Kafka仅在第一个主题为空时才从第二个主题中读取内容?

欢呼

1 个答案:

答案 0 :(得分:1)

这与Spring无关,来自订阅用户的主题的消息的分发是代理的功能。

问题是您在两个主题上都使用一个使用者(侦听器容器)。

要为每个消费者指定专门的消费者,请使用多个注释...

@KafkaListener(groupId = "live.group", topics = "sync-live", concurrency = "1")
@KafkaListener(groupId = "bulk.group", topics = "sync-bulk", concurrency = "1")
public synchronized void listen(...) { ... }

synchronized将阻止两个容器同时调用侦听器。如果那不是问题,请忽略它。