簡體   English   中英

Spring @KafkaListener 和並發

[英]Spring @KafkaListener and concurrency

我正在使用 spring 啟動 + spring @KafkaListener。 我期望的行為是:我的 kafka 監聽器在 10 個線程中讀取消息。 因此,如果其中一個線程掛起,其他消息將繼續讀取和處理消息。

我定義了 bean

@Bean
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
        ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
        ConsumerFactory<Object, Object> kafkaConsumerFactory)
{

    ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
    configurer.configure(factory, kafkaConsumerFactory);
    factory.getContainerProperties().setMissingTopicsFatal(false);
    factory.getContainerProperties().setCommitLogLevel(LogIfLevelEnabled.Level.INFO);
    return factory;
}

和 spring 引導配置:

spring.kafka.listener.concurrency=10

我看到所有配置都有效,我在 jmx 中看到了我的 10 個線程:

在此處輸入圖像描述

但后來我做了這樣的測試:

 @KafkaListener(topics = {
            "${topic.name}" }, clientIdPrefix = "${kafka.client.id.prefix}", idIsGroup = false, id = "${kafka.listener.name}", containerFactory = "kafkaListenerContainerFactory")
    public void listen(ConsumerRecord<String, String> record)
    {
        if(record.getVersion() < 3) {
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        else
            System.out.println("It works!");

    }

如果版本 < 3,則掛起,否則 - 工作。 我發送了 3 條版本為 1,2 和 3 的消息。我希望版本 1 和 2 的消息會掛起,但版本 3 將在監聽器時處理。 但不幸的是,版本 3 的消息在開始處理之前等待消息 1 和 2。

也許我的期望不正確,這是卡夫卡聽眾的正確行為。 請幫我處理kafka並發,為什么會這樣?

卡夫卡不是這樣工作的。 您至少需要與消費者一樣多的分區(由 spring 容器中的concurrency控制)。

此外,一次只有一個消費者(在一個組中)可以從一個分區消費,因此,即使您增加分區,“卡住”消費者后面的同一分區中的記錄也不會被其他消費者接收。

如果您想要故障轉移 Kafka,您必須啟動更多應用程序實例。

示例:您有一個名為test的主題,帶有 1 個分區,您將使用相同的 Kafka 組創建應用程序的 2 個實例。 一個實例將處理您的數據,另一個將等待並開始處理消息,以防第一個實例崩潰。 如果您有 N 個分區和 N + 1 或 2 或 3 個應用程序實例,則相同。 此外,每個實例將只有一個消費者線程。

有關它的更多信息,請在 Google 上搜索: Kafka Consumer Groups

暫無
暫無

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

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