簡體   English   中英

Kafka生產者彈性配置:失敗但永不阻塞

[英]Kafka producer resilience config: Fail but never block

我目前正在從netflix( https://www.slideshare.net/wangxia5/netflix-kafka )學習一些Kafka最佳實踐。 這是一張很好的幻燈片。 但是,我真的不理解其中提到的有關生產者彈性配置的一張幻燈片(幻燈片18),我希望stackoverflow中的某個人非常樂意為我提供相關信息(不能找到視頻或聯系作者...)。

幻燈片提到: 失敗,但從不阻止生產者彈性配置

Block.on.buffer.full=false 

即使以為這是已棄用的配置,我想的想法是讓生產者立即失敗而不是阻塞等待。 在最新的kafka配置中,我可以為block.max.ms使用一個較小的值,以使生產者無法發送消息,而不是阻止消息。

問題1:為什么我們要立即失敗,是否意味着以后重試而不是阻止它?

Handle Potential Block for first meta data request

問題2:我可以了解用戶端的元數據。 即注冊消費者組和東西,但是從生產者的角度來看元數據請求是什么? 並且它可能被阻止了嗎? 是否有任何kafka文檔來描述

Periodically check whether Kafka producer was open successfully 

問題3:有沒有一種方法可以檢查該檢查以及該檢查有什么好處?

提前致謝 :)

您必須記住kafka生產者的工作方式:

從API文檔中:

生產者由一個緩沖空間池和一個I / O后台線程組成,該緩沖池保存尚未傳輸到服務器的記錄,該I / O線程負責將這些記錄轉換為請求並將它們傳輸到集群。

如果調用send方法將記錄發送到代理,則此消息將添加到內部緩沖區(可以使用buffer.memory配置屬性來配置此緩沖區的大小)。 現在可能發生不同的事情:

  1. 快樂路徑:來自緩沖區的消息將由后台I / O線程轉換為對代理的請求,代理將對此消息進行確認,一切都會好起來。
  2. 無法將消息發送到kafka代理(與代理的連接已斷開,正在生成消息,其發送速度超出了它們的發送速度,等等)。 在這種情況下,由您決定要做什么。 max.block.ms (替代block.on.buffer.full )設置為正值,則發送消息將在此time(1)時間內阻塞,並在之后發生超時異常。

關於您的問題:(1)如果我看對幻燈片,Netflix明確希望丟棄無法發送給代理的消息(而不是阻止,重試,失敗...)。 當然,這很大程度上取決於您的應用程序和要處理的消息類型。 如果它只是記錄消息,那可能沒什么大不了的。 如果涉及金融交易,您可能需要

(2)生產者需要一些有關集群的元數據。 例如,它需要知道哪個密鑰進入哪個分區。 hortonworks有一篇不錯的博客文章,說明生產者如何進行內部工作。 我認為值得一讀: https : //community.hortonworks.com/articles/72429/how-kafka-producer-work-internally.html

此外,聲明:

據我所知,針對第一個元數據請求的處理潛力塊指出了一個問題。 發送的第一個調用將進行同步。 向代理發送元數據請求,因此可能需要更長的時間。

(3)如果生產者閑置了一段時間,則代理將關閉與生產者的connections.max.idle.ms (請參閱connections.max.idle.ms )。 我不知道有什么標准方法可以保持您的使用者的連接處於活動狀態,甚至無法檢查連接是否仍處於活動狀態。 您可以做的是定期向代理發送一個元數據請求( producer.partitionsFor(anyTopic) )。 但這又不是您的應用程序遇到的問題。


(1)當涉及到細節時,計算經過的時間要考慮什么,這有點棘手。 對於max.block.ms實際上是:

  • 元數據獲取時間
  • 緩沖區滿塊時間
  • 序列化時間(定制序列化器)
  • 分區時間(定制分區)

暫無
暫無

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

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