2014-01-27 84 views
6

在高容量實時java web應用程序中,我正在向apache kafka發送消息。 目前我發送給一個主題,但將來可能需要發送消息給多個主題。有多少生產者可以在卡夫卡創建?

在這種情況下,我不確定每個主題創建制作人的天氣還是應該使用單個製作人來處理所有主題?

這裏是我的代碼:

props = new Properties(); 
props.put("zk.connect", <zk-ip1>:<2181>,<zk-ip3>:<2181>,<zk-ip3>:<2181>); 
props.put("zk.connectiontimeout.ms", "1000000"); 
props.put("producer.type", "async"); 

Producer<String, Message> producer = new kafka.javaapi.producer.Producer<String, Message>(new ProducerConfig(props)); 

ProducerData<String, Message> producerData1 = new ProducerData<String, Message>("someTopic1", messageTosend); 
ProducerData<String, Message> producerData2 = new ProducerData<String, Message>("someTopic2", messageTosend); 

producer.send(producerData1); 
producer.send(producerData2); 

正如你所看到的,一旦生產商已經創建我可以用它來發送數據到不同的主題。 我想知道最佳做法是什麼?如果我的應用程序發送到多個主題(每個主題獲取不同的數據),我可以/應該使用單個生產者還是應該創建多個生產者?何時(通常來說)我應該使用多於一個生產者?

回答

6

一般而言,所有主題的單一製作人將會更有效地使用網絡。

如果kafka客戶端在同一個Kafka節點上看到多個主題+分區,它可以在單個消息中爲這兩個主題+分區發送消息。卡夫卡優化消息批量,所以這是有效的。

此外,您的Web服務器只需要保持至多一個到每個Kafka節點的tcp連接,而不是每個節點的每個生產者一個連接。

有關卡夫卡的設計更多的信息: https://kafka.apache.org/documentation.html#design

正如你在評論提到,鎖爭可能會成爲一個限制因素,因人而異。

1

我們已經在實踐中驗證過,每個主題只有一個生產者是最優的。但是,如果您遇到長而胖的網絡問題,那麼擁有多個生產者會很有用,在這種情況下,我們必須擁有多個連接才能充分利用網絡。

單個TCP連接(由Kafka使用)的批處理和流水線本身不會擴展到大批量,如果您必須發送到遠處的主機,除非您進行TCP調優以具有較大的窗口大小。當你可能試驗更多的生產者時,情況就是如此。

0

在0.8.2.0及更高版本中,如果您對多個主題使用相同的kafka生產者,則循環分配的缺省分區邏輯將失敗。

0

Kafka: The Definitive Guide,在卡夫卡生產者章,作者說:

你可能要開始與一個生產者和一個線程。如果你需要更好的吞吐量,你可以添加更多使用同一個生產者的線程。一旦停止提高吞吐量,您可以嚮應用程序添加更多生產者以實現更高的吞吐量。

所以實際上可能有多個生產者的好處。

相關問題