Kafka Consumer

Kafka 與很多其它 MQ 不太一樣,Kafka 中的 Topic 具有分區(Partition)的概念,一個 Topic 可以指定一個或多個分區,每個分區內的數據都是有序的,發佈的消息最終落到哪個分區是有規則的,默認情況下隨機(但其實也不完全隨機,內部會有一些機制),實際情況下我們可能會對消息指定一個 Key, 相同 Key 的消息會落到一個分區上,不同的 Key 的消息也可能會落到相同的分區,分區與 Key 的關係的1對多,但 Key 與 分區的關係必須是1對1。

topic partition

消費者組 (Consumer Group)

消費者並不是獨立存在的,每一個消費者實例必定屬於一個消費組。

Consumer Group

消費組主要說明:

  • Consumer Group 需要設定一個 group.id,Consumer Group 的唯一標識;

  • Consumer Group 下可以有一個或多個 Consumer 實例,Consumer 實例可以是一個進程,也可以是一個線程;

  • Consumer Group 可以訂閱多個 Topic,但一個 Topic 下的一個分區只能分配給某個 Consumer 實例消費,不同的 Consumer Group 可以消費 Topic 下同一個分區的數據;

  • Consumer Group 最多的 Consumer 實例個數不應超過訂閱的 Topic 的分區數,因爲一個分區只能給一個 Consumer 實例消費,多出來的 Consumer 實例完全是浪費;

在實際消費數據時,可以根據消費情況動態對 Topic 的分區數進行調整,從而達到更高的效率。

消費組的偏移重置設定(auto.offset.reset)

auto.offset.reset

largest(默認) ,也可以使用 latest、end

當各分區下有已提交的 offset 時,從提交的 offset 開始消費;無提交的 offset 時,消費新產生的該分區下的數據

注意 : 已提交的 offset 不是指 producer 發送的消息對應的 offset ,而是指消費者消費的消息對應的 offset 。

這到底是什麼意思?這裏對兩種情況進行解釋一下:

  1. 在沒有啓動 Consumer 實例的情況下,Producer 向某個 Topic 發佈了消息。之後當 Consumer 實例啓動時是不會消費之前發佈的數據的,只有新發布的數據會被消費;

  2. 在 Consumer 實例啓動的情況下,當 Producer 向某個 Topic(n 個分區) 發佈消息時,當 Consumer 實例掛掉時並沒有對所有分區有過消費記錄,在掛掉期間,如果 Producer 發佈的消息恰好落到沒有消費記錄的分區,Consumer 實例重新啓動後,這部分消息(落到沒有消費記錄分區)將不會消費,只有新發布的數據會被消費;

smallest,也可以使用 earliest、beginning

當各分區下有已提交的 offset 時,從提交的 offset 開始消費;無提交的offset時,從頭開始消費

error

Topic 各分區都存在已提交的 offset 時,從 offset 後開始消費;只要有一個分區不存在已提交的 offset ,則拋出異常

如果沒有使用過 largest 或者 smallest 方式使 Topic 各分區下有已提交的 offset,設置成 error 必然是一直異常。

配置例子(C# 版)

var config = new Dictionary<string, object>
{
    { "group.id", "consumer-group" }, // 消費組標識
    { "bootstrap.servers", "127.0.0.1:9092" }, // broker地址,如果是集羣,可以用 "," 分割
    { "auto.offset.reset", "smallest"}
};

參考鏈接

Global configuration properties

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章