簡體   English   中英

Apache Camel - Kafka 組件 - 單生產者多消費者

[英]Apache Camel - Kafka component - single producer multiple consumer

我正在創建兩個 apache 駱駝(藍圖 XML)kafka 項目,一個是 kafka-producer,它接受請求並將其存儲在 kafka 服務器中,另一個是 kafka-consumer,它從 kafka 服務器獲取消息並處理它們。

此設置適用於單個主題和單個消費者。 但是,如何在同一個 kafka 主題中創建單獨的消費者組? 如何在不同消費者組內的同一主題內路由多個消費者特定消息? 任何幫助表示贊賞。 謝謝你。

您的問題很籠統,因為不太清楚您要解決的問題是什么,因此很難理解是否有更好的方法來實施解決方案。

無論如何,首先讓我們說,據我所知,您正在尋找一個選擇性消費者 (EIP),這是 Kafka 和消費者 API 不支持開箱即用的東西。 選擇性消費者可以根據生產者預先放置的特定選擇器的值來選擇從隊列或主題中選擇什么消息。 這個特性也必須在消息代理中實現,但是 kafka 沒有這樣的能力。

Kafka 確實在純發布/訂閱和隊列之間實現了混合解決方案。 話雖如此,您可以做的是與一個或多個消費者組一起訂閱該主題(稍后會詳細介紹),並通過檢查消息本身來過濾掉所有您不感興趣的消息。 在消息傳遞和 EIP 世界中,這種模式被稱為過濾器數組。 正如您可以想象的那樣,這發生在消息被廣播給所有訂閱者之后; 因此,如果該解決方案不符合您的要求或上下文,那么您可以考慮實現一個基於內容的路由器,該路由器旨在僅在您的集中控制下將消息發送給消費者的子集(這意味着中間消費者特定的渠道可以當然是其他 Kafka 主題或 seda/VM 隊列)。

轉到第二個問題,這里是 Kafka 組件的官方網站:https://camel.apache.org/components/latest/kafka-component.ZFC35FDC70D5FC69D269883A822C7A5 為了創建不同的消費者組,您只需要定義多個路由,每個路由都有一個專用的 groupId。 通過添加 groupdId 屬性,您將通知消費者組協調器(位於 Kafka 代理中)存在多個獨立的消費者組,並且代理將使用這些來區分和分別對待它們(通過向他們發送每個記錄存儲在主題中的消息)...

這是一個例子:

public void configure() throws Exception {
    from("kafka:myTopic?brokers={{kafkaBootstrapServers}}" +
                 "&groupId=myFirstConsumerGroup"
            .log("Message received by myFirstConsumerGroup : ${body}");

    from("kafka:myTopic?brokers={{kafkaBootstrapServers}}" +
                 "&groupId=mySecondConsumerGroup"
            .log("Message received by mySecondConsumerGroup : ${body}");

}

可以看到,我在同一個RouteBuilder中創建了兩條路由,並不是說在同一個Java進程中。 在我能想到的大多數用例中,這是一個非常糟糕的設計決策,因為沒有單一的責任、分離的關注點並且它們不會擴展。 但同樣,這取決於您的要求/背景。 出於完整性考慮,請考慮查看所有其他 Kafka 組件屬性,因為可能還有許多其他您感興趣的配置,例如每個組的消費者線程數。 我試圖保持高水平,以發起討論...如果您有新的更新,我將編輯我的答案。 希望我有所幫助!

暫無
暫無

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

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