簡體   English   中英

如何有效地將消息從集合中生成到 Kafka

[英]How to efficiently produce messages out of a collection to Kafka

在我的 Scala (2.11) stream 應用程序中,我正在使用 IBM MQ 中一個隊列中的數據並將其寫入具有一個分區的 Kafka 主題。 使用 MQ 中的數據后,消息有效負載被拆分為 3000 條較小的消息,這些消息存儲在字符串序列中。 然后使用 KafkaProducer 將這 3000 條消息中的每一條發送到 Kafka(版本 2.x)。

你將如何發送這 3000 條消息?

我無法增加 IBM MQ 中的隊列數量(不受我的控制),也無法增加主題中的分區數量(需要對消息進行排序,並且編寫自定義分區程序會影響過多的主題消費者)。

Producer 設置當前為:

  • 確認=1
  • 逗留.ms=0
  • 批處理大小=65536

但是優化它們可能是它自己的問題,而不是我當前問題的一部分。

目前,我正在做

import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord}

private lazy val kafkaProducer: KafkaProducer[String, String] = new KafkaProducer[String, String](someProperties)
val messages: Seq[String] = Seq(String1, …, String3000)
for (msg <- messages) {
    val future = kafkaProducer.send(new ProducerRecord[String, String](someTopic, someKey, msg))
    val recordMetadata = future.get()
}

對我來說,這看起來不是最優雅和最有效的方式。 有沒有增加吞吐量的程序化方法?


在@radai回答后編輯

由於答案為我指明了正確的方向,我仔細研究了不同的 Producer 方法。 Kafka - The Definitive Guide 一書列出了這些方法:

即發即棄我們向服務器發送一條消息,並不真正關心它是否成功到達。 大多數情況下,它會成功到達,因為 Kafka 是高可用的,生產者會自動重試發送消息。 但是,使用此方法會丟失一些消息。

同步發送我們發送一條消息,send()方法返回一個Future object,我們使用get()等待future,看看send()是否成功。

異步發送我們使用回調 function 調用 send() 方法,當它收到來自 Kafka 代理的響應時觸發

現在我的代碼看起來像這樣(省略了錯誤處理和回調類的定義):

  val asyncProducer = new KafkaProducer[String, String](someProperties)

  for (msg <- messages) {
    val record = new ProducerRecord[String, String](someTopic, someKey, msg)
    asyncProducer.send(record, new compareProducerCallback)
  }
  asyncProducer.flush()

我已經比較了 10000 條非常小的消息的所有方法。 這是我的測量結果:

  1. 即發即棄:173683464ns

  2. 同步發送:29195039875ns

  3. 異步發送:44153826ns

老實說,通過選擇正確的屬性(batch.size、linger.ms、...),可能更有可能優化所有這些。

我可以看到您的代碼變慢的最大原因是您正在等待每次發送的未來。

kafka 被設計成批量發送。 通過一次發送一條記錄,您正在等待每條記錄的往返時間,並且您沒有從壓縮中獲得任何好處。

要做的“慣用”事情是發送所有內容,然后在第二個循環中阻止所有生成的期貨。

此外,如果您打算這樣做,我會推遲 linger 備份(否則您的第一條記錄會導致一批大小為 1,總體上會減慢您的速度。請參閱https://en.wikipedia.org/wiki/Nagle%27s_algorithm ) 並在發送循環完成后在生產者上調用flush()

暫無
暫無

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

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