簡體   English   中英

Zookeeper 如何從 __consumer_offsets 主題中檢索消費者偏移量?

[英]How does Zookeeper retrive the consumer offsets from __consumer_offsets topic?

這是“ zookeeper 在哪里存儲 Kafka 集群和相關信息? ”的后續問題,基於 Armando Ballaci 提供的答案。

現在很明顯,消費者偏移量存儲在 Kafka 集群中一個名為__consumer_offsets的特殊主題中。 沒關系,我只是想知道這些偏移量的檢索是如何工作的。

主題不像 RDBS,我們可以基於某個謂詞查詢任意數據。 例如 - 如果數據存儲在 RDBMS 中,可能像下面這樣的查詢將獲取某個消費者組的特定消費者的主題的特定分區的消費者偏移量。

select consumer_offset__read, consumer_offset__commited from consumer_offset_table where consumer-grp-id="x" and partitionid="y"

但顯然這種檢索在 Kafka Topics 上是不可能的。 那么從主題中檢索機制是如何工作的呢? 有人可以詳細說明嗎?

(來自 Kafka 分區的數據在 FIFO 中讀取,如果遵循 Kafka 消費者 model 來檢索特定偏移量,則必須處理大量額外數據並且速度會很慢。所以我想知道它是否以其他方式完成。 ..)

當我在日常工作中偶然發現這一點時,我可以在 web 上找到一些描述如下:

在 Kafka 到 0.8.1.1 的版本中,消費者將他們的偏移量提交給 ZooKeeper。 當存在大量偏移量(即消費者計數 * 分區計數)時,ZooKeeper 不能很好地擴展(尤其是對於寫入)。 幸運的是,Kafka 現在提供了一種存儲消費者偏移量的理想機制。 消費者可以通過將偏移量寫入持久(復制)和高可用性主題來提交他們在 Kafka 中的偏移量。 消費者可以通過讀取這個主題來獲取偏移量(盡管我們提供了一個內存中的偏移量緩存以便更快地訪問)。 即,偏移提交是常規的生產者請求(成本低廉),偏移獲取是快速 memory 查找。

Kafka 官方文檔描述了該功能的工作原理以及如何將偏移量從 ZooKeeper 遷移到 Kafka。 這個 wiki 提供了示例代碼,展示了如何使用新的基於 Kafka 的偏移存儲機制。

try {
        BlockingChannel channel = new BlockingChannel("localhost", 9092,
                BlockingChannel.UseDefaultBufferSize(),
                BlockingChannel.UseDefaultBufferSize(),
                5000 /* read timeout in millis */);
        channel.connect();
        final String MY_GROUP = "demoGroup";
        final String MY_CLIENTID = "demoClientId";
        int correlationId = 0;
        final TopicAndPartition testPartition0 = new TopicAndPartition("demoTopic", 0);
        final TopicAndPartition testPartition1 = new TopicAndPartition("demoTopic", 1);
        channel.send(new ConsumerMetadataRequest(MY_GROUP, ConsumerMetadataRequest.CurrentVersion(), correlationId++, MY_CLIENTID));
        ConsumerMetadataResponse metadataResponse = ConsumerMetadataResponse.readFrom(channel.receive().buffer());
 
        if (metadataResponse.errorCode() == ErrorMapping.NoError()) {
            Broker offsetManager = metadataResponse.coordinator();
            // if the coordinator is different, from the above channel's host then reconnect
            channel.disconnect();
            channel = new BlockingChannel(offsetManager.host(), offsetManager.port(),
                                          BlockingChannel.UseDefaultBufferSize(),
                                          BlockingChannel.UseDefaultBufferSize(),
                                          5000 /* read timeout in millis */);
            channel.connect();
        } else {
            // retry (after backoff)
        }
    }
    catch (IOException e) {
        // retry the query (after backoff)
    }

在 Kafka 到 0.8.1.1 的版本中,消費者將他們的偏移量提交給 ZooKeeper。 當存在大量偏移量(即消費者計數 * 分區計數)時,ZooKeeper 不能很好地擴展(尤其是對於寫入)。 幸運的是,Kafka 現在提供了一種存儲消費者偏移量的理想機制。 消費者可以通過將偏移量寫入持久(復制)和高可用性主題來提交他們在 Kafka 中的偏移量。 消費者可以通過讀取這個主題來獲取偏移量(盡管我們提供了一個內存中的偏移量緩存以便更快地訪問)。 即,偏移提交是常規的生產者請求(成本低廉),偏移獲取是快速 memory 查找。

Kafka 官方文檔描述了該功能的工作原理以及如何將偏移量從 ZooKeeper 遷移到 Kafka。

這個想法是,如果您需要描述的功能,則需要將數據存儲在 RDBS 或 NoSQL 數據庫或 ELK 堆棧中。 一個好的模式是使用 Sink 連接器通過 Kafka Connect。 Kafka 中的正常消息處理是通過消費者或 Stream 定義完成的,這些定義在事件發生時對其做出反應。 在某些情況下,您當然可以尋求抵消或時間戳,這是完全可能的......

在最新版本的 Kafka 中,偏移量不再保存在 Zookeeper 中。 所以 Zookeeper 不參與消費者偏移處理。

暫無
暫無

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

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