簡體   English   中英

Kafka:生產不同消息速率的數千個主題的吞吐量

[英]Kafka: Throughput of producing to thousands of topics with different message rate

任務是將消息從一個巨大的源主題路由到許多(幾千個)目標主題。 總體速率約為每秒幾百萬條記錄。 它現在幾乎無法處理此類負載,我們正在尋找優化它的解決方案。 但是,它似乎沒有達到硬件或網絡級別的任何限制,所以我認為它可以改進。 延遲並不重要(幾分鍾延遲就可以),平均消息大小小於 1 KiB。

增加吞吐量最明顯的方法是增大batch.sizelinger.ms 但問題是目標主題中的消息速率不同:取決於消息目的地,速率可能從每秒幾條消息到每秒數十萬條消息不等。

據我了解(如果我錯了,請糾正我),但batch.size是每個分區的參數。 因此,如果我們將batch.size設置得太大,我們將從 memory 中得到 go,因為它乘以了多個目標主題,即使它們都只有一個分區。 否則,如果batch.size很小,producer 就會過於頻繁地向 broker 發送請求。 在每個應用程序實例中,我們為所有目標主題使用一個生產者( ProduceRequest可以包含不同主題的批次)。 為每個主題設置不同的參數的唯一方法是為每個主題使用單獨的生產者,但這意味着數千個線程和許多上下文切換。

我們可以設置實際ProduceRequest最小大小,即像batch.size ,但對於請求中的整體批次,即與max.request.size相反的東西嗎?

或者有什么辦法可以增加生產者的吞吐量?

這個問題看起來可以解決,而且我們似乎已經解決了。 Kafka 到 stream 到 3k 主題不是什么大問題,但是有一些事情你應該注意:

  1. Kafka-producer 嘗試在開始時分配batch.size * number_of_destination_partitions memory。 如果你有batch.size等於10mb3k主題,每個主題有1分區,Kafka-producer 將需要至少~30gb開始( 源代碼)。 所以你擁有的目標分區越多,你需要設置的batch.size就越少,或者你需要的 memory 就越多。 我們選擇小batch.size

  2. 每個目標主題的消息速率不影響一般性能。 Kafka 生產者為每個請求發送多個批次。 這里max.request.size發揮作用( 源代碼maxSizemax.request.size )。 max.request.size越高,每個請求可以發送的批次越多。 重要的是要了解達到batch.sizelinger.ms不會立即觸發向代理發送批處理。 一旦批次達到batch.sizelinger.ms ,它就會被標記為可發送,稍后將與其他批次一起處理( 源代碼)。 此外, batch.sizelinger.ms並不是將批次標記為可發送的唯一原因(查看前面的鏈接)。 這是實際發送批次的地方( 源代碼)。 這就是為什么不需要每個目標主題的相同事件率,但仍然存在一些細微差別,接下來將進行描述。

    2.1. 關於linger.ms的幾句話。 不能確定它在這種情況下的作用。 一方面,它越大,Kafka 生產者等待收集確切分區的消息的時間就越長,並且每個請求將發送該分區的更多數據。 另一方面,似乎它越少,不同分區的更多批次就可以打包到一個請求中。 雖然不確定如何做得更好。

  3. 盡管 Kafka-producer 能夠為每個請求發送多個批次,但它不能為一個特定分區的每個請求發送多個批次。 這就是為什么如果目標主題的消息速率偏斜,則必須增加大多數加載主題的分區數以增加吞吐量。 但始終有必要記住,分區數的增加會導致 memory 使用量的增加。

實際上,上面的信息幫助我們解決了性能問題。 但可能還有其他我們還不知道的細微差別。

我希望它會有用。

暫無
暫無

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

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