簡體   English   中英

Apache-Kafka,batch.size 與 buffer.memory

[英]Apache-Kafka, batch.size vs buffer.memory

我試圖找出 Kafka Producer 中設置 batch.size 和 buffer.memory 之間的區別。

據我了解 batch.size: 這是可以發送的批次的最大大小。

該文檔將 buffer.memory 描述為:生產者可用於緩沖等待發送的記錄的內存字節。

我不明白這兩者之間的區別。 有人可以解釋一下嗎?

謝謝

在我看來,

batch.size :單個請求中可以發送的最大數據量。 如果 batch.size 為 (32*1024),則意味着可以在單個請求中發送 32 KB。

buffer.memory :如果 Kafka Producer 無法將消息(批次)發送到 Kafka 代理(假設代理已關閉)。 它開始在緩沖存儲器(默認為 32 MB)中累積消息批次。 一旦緩沖區已滿,它將等待“ max.block.ms ”(默認60,000 毫秒)以便可以清除緩沖區。 然后是拋出異常。

Confluent 文檔頁面對這兩種生產者配置進行了描述,如下所示:

  • 批量大小

Kafka 生產者試圖將發送的消息分批收集以提高吞吐量。 對於 Java 客戶端,您可以使用batch.size來控制每個消息批處理的最大大小(以字節為單位)。

  • 緩沖存儲器

使用buffer.memory來限制 Java 客戶端可用於收集未發送消息的總內存。 當達到此限制時,生產者將在引發異常之前阻止額外的發送長達max.block.ms

Kafka Producer 和 Kafka Consumer 有許多有助於性能調整的配置,例如獲得低延遲和高吞吐量。 buffer.memorybatch.size也是其中之一,這些是 Kafka Producer 特有的。 讓我們看看這些配置的更多細節。

  1. buffer.memory這設置了生產者將用於緩沖等待發送到代理的消息的內存量。 如果應用程序發送消息的速度比它們可以傳遞到服務器的速度快,生產者可能會耗盡空間,並且額外的 send() 調用將被阻塞或基於max.block.ms配置拋出異常,這允許阻塞特定時間時間然后拋出異常。 另一種情況可能是,如果所有代理服務器由於任何原因而關閉,並且 kafka 生產者將無法向代理發送消息,並且生產者必須將這些消息保存在基於buffer.memory配置分配的內存中,但如果經紀人沒有恢復正常狀態,那么如上所述 mx.block.ms 時間將被視為釋放空間。 max.block.ms 的默認值為 60,000 ms buffer.memory 的默認值為 32 MB (33554432)

  2. batch.size當多條記錄發送到同一個分區時,生產者會將它們批量放入。 此配置控制將用於每個批處理的以字節為單位的內存量(不是消息)。 當批處理已滿時,將發送批處理中的所有消息。 然而,這並不意味着生產者將等待批次變滿。 生產者將發送半滿批次,甚至只發送一條消息的批次。 因此,將批量大小設置得太大不會導致發送消息的延遲。 它只會為批次使用內存。 將批量大小設置得太小會增加額外的開銷,因為生產者需要更頻繁地發送消息。 默認批量大小為 16384。

batch.size也做工基於它控制的時間發送當前批次之前等待附加的消息量linger.ms。 我們知道,當 rge 當前批次已滿或達到 linger.ms 時間時,Kafka 生產者會發送一批消息。 默認情況下,生產者會在有可用的發送者線程發送消息時立即發送消息,即使 bacth 中只有消息。

暫無
暫無

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

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