簡體   English   中英

使用Spring Kafka進行Kafka主題排序

[英]Kafka Topic ordering with 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僅在第一個主題為空時才從第二個主題讀取?

干杯

這與Spring無關,來自訂閱用戶的主題的消息的分發是代理的功能。

問題是您在兩個主題上都使用一個使用者(偵聽器容器)。

要為每個用戶指定專門的使用者,請使用多個注釋...

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

synchronized將阻止兩個容器同時調用偵聽器。 如果那不是問題,請忽略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM