[英]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
配置屬性來配置此緩沖區的大小)。 現在可能發生不同的事情:
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.