Apache Kafka 中 GroupId 和 ConsumerId 的區別
一、簡介
在本教程中,我們將闡明 Apache Kafka 中 GroupId 和 ConsumerId 之間的區別,這對於理解如何正確設定消費者非常重要。此外,我們還將討論 ClientId 和 ConsumerId 之間的差異,並了解它們之間的關係。
2. 消費群
在探索 Apache Kafka 中標識符類型之間的差異之前,讓我們先了解一下消費者群組。
Consumer Group 由多個消費者組成,這些消費者共同消費來自一個或多個主題的訊息,完成訊息的並行處理。它們在分散式 Kafka 環境中實現可擴展性、容錯性和高效的訊息並行處理。
至關重要的是,組內的每個消費者只負責處理其主題的子集,稱為分區。
3. 理解標識符
接下來,讓我們在高層定義我們在本教程中考慮的所有標識符:
- GroupId唯一識別一個Consumer Group。
- ClientId 唯一識別傳遞到伺服器的請求。
- ConsumerId 分配給消費者群組中的各個消費者,是
client.id
消費者屬性和消費者的唯一識別碼的組合。
4. 標識符的用途
接下來,讓我們了解每個標識符的用途。
GroupId 是負載平衡機制的核心,支援在消費者之間分配分區。消費者組管理同一組內消費者之間的協調、負載平衡和分區分配。 Kafka 確保在任何給定時間只有一個消費者可以存取每個分區。如果群組內的某個消費者發生故障,Kafka 會無縫地將分區重新分配給其他消費者,以保持訊息處理的連續性。
Kafka 使用 ConsumerIds 來確保群組內的每個消費者在與 Kafka 代理互動時都是唯一可識別的。此標識符完全由 Kafka 管理,用於管理消費者偏移量並追蹤處理來自分區的訊息的進度。
最後,ClientId 允許開發人員配置將包含在伺服器端請求日誌記錄中的邏輯應用程式名稱,從而追蹤請求的來源,而不僅僅是 IP/連接埠。因為我們可以控制這個值,所以我們可以使用相同的 ClientId 來建立兩個單獨的客戶端。但是,在這種情況下,Kafka產生的ConsumerId就會不同。
5、配置GroupId和ConsumerId
5.1.使用 Spring Kafka
讓我們在 Spring Kafka 中為消費者定義 GroupId 和 ConsumerId。我們將透過利用@KafkaListener
註解來實現這一點:
@KafkaListener(topics = "${kafka.topic.name:test-topic}", clientIdPrefix = "neo", groupId = "${kafka.consumer.groupId:test-consumer-group}", concurrency = "4")
public void receive(@Payload String payload, Consumer<String, String> consumer) {
LOGGER.info("Consumer='{}' received payload='{}'", consumer.groupMetadata()
.memberId(), payload);
this.payload = payload;
latch.countDown();
}
請注意我們如何將groupId
屬性指定為我們選擇的任意值。
此外,我們還設定了clientIdPrefix
屬性以包含自訂前綴。讓我們檢查應用程式日誌以驗證 ConsumerId 是否包含此前綴:
cbskafka.groupId.MyKafkaConsumer : Consumer='neo-1-bae916e4-eacb-485a-9c58-bc22a0eb6187' received payload='Test 123...'
consumerId,
(也稱為memberId,
的值遵循特定的模式。它以clientIdPrefix
開頭,然後是基於群組中消費者數量的計數器,最後是UUID
。
5.2.使用 Kafka CLI
我們也可以透過 CLI 來設定 GroupId 和 ConsumerId。我們將使用kafka-console-consumer.sh
腳本。讓我們啟動一個控制台消費者,將group.id
設定為test-consumer-group
並將client.id
屬性設定為neo-<sequence_number>:
$ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic Test --group test-consumer-group --consumer-property "client.id=neo-1"
在這種情況下,我們必須確保為每個客戶端分配一個唯一的client.id
。此行為與 Spring Kafka 不同,在 Spring Kafka 中,我們設定clientIdPrefix
,框架會為其新增序號。如果我們describe
消費者群組,我們將看到 Kafka 為每個消費者產生的 ConsumerId:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group test-consumer-group --describe
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
test-consumer-group Test 0 0 0 0 neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1 neo-1
test-consumer-group Test 1 0 0 0 neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1 neo-1
test-consumer-group Test 2 0 0 0 neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1 neo-1
test-consumer-group Test 3 0 0 0 neo-1-975feb3f-9e5a-424b-9da3-c2ec3bc475d6 /127.0.0.1 neo-1
test-consumer-group Test 7 0 0 0 neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1 neo-3
test-consumer-group Test 8 0 0 0 neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1 neo-3
test-consumer-group Test 9 0 0 0 neo-3-09b8d4ee-5f03-4386-94b1-e068320b5e6a /127.0.0.1 neo-3
test-consumer-group Test 4 0 0 0 neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1 neo-2
test-consumer-group Test 5 0 0 0 neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1 neo-2
test-consumer-group Test 6 0 0 0 neo-2-6a39714e-4bdd-4ab8-bc8c-5463d78032ec /127.0.0.1 neo-2
六、總結
讓我們總結一下我們討論的三個標識符之間的主要區別:
方面 | 組ID | 消費者ID | 客戶端ID |
它能辨識什麼? | 消費者組 | 消費者群體中的個人消費者 | 消費者群體中的個人消費者 |
它的價值從何而來? | 開發者設定GroupId | Kafka根據 | 開發者設定 |
它是獨一無二的嗎? | 如果兩個消費者群組具有相同的 GroupId,則它們實際上是一個 | Kafka確保每個消費者都有獨特的價值 | 它不必是唯一的。根據用例,可以為兩個消費者的 |
七、結論
在本文中,我們研究了一些與 Kafka 消費者相關的關鍵識別碼:GroupId、ClientId 和 ConsumerId。我們現在了解它們的用途以及如何配置它們。
與往常一樣,完整的源代碼可以在 GitHub 上取得。