2016-07-28 150 views
1

我是卡夫卡的新人。我的要求是,我有兩個分區,例如Partition-0和Partition-1,我有值列表也包含KEY值。我想根據我的密鑰存儲數據,如鍵1將進入分區0,鍵2將進入分區1。使用舊的API有辦法實現,就像我們需要實現分區界面一樣,但我怎樣才能用新的API來實現。謝謝卡夫卡:如何在卡夫卡實現循環分區

回答

0

您可以通過重寫卡夫卡生產的default partitioner產生卡夫卡輪循方式。

僞實施

class RRPartitioner(): 
     def __init__(): 
      # Using topic metadata get total number of partitions 
      self.total_partitions = client[topic].get_number_partitions() 
      self.part_offset = 0 

     def partitioner(self, key, msg): 
      if self.part_offset > self.total_partitions: 
       self.part_offset = 0 
       return self.part_offset 
      else: 
       self.part_offset += 1 
       return self.part_offset 

上面的實現它的純循環,如果你想根據鍵進行排序的消息,並有循環,你將不得不做更多的自定義分區。

+0

這是最簡單的解決辦法,但如果添加在運行時的分區,這是一個完全有效的情況下 – serejja

+0

True..you將不得不重新啓動定期生產者或輪詢元數據將無法正常工作變化。胸圍大多數現有的鍵控生產商將有相同的問題IIRC。 –

0

如果你想循環機制的行爲,只是在寫給Producer的時候不要傳遞密鑰,DefaultPartitioner會爲你做這項工作。您不需要編寫自定義實現。從的javadoc:

/** 
* The default partitioning strategy: 
* <ul> 
* <li>If a partition is specified in the record, use it 
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key 
* <li>If no partition or key is present choose a partition in a round-robin fashion 
*/