2014-10-30 61 views
2

我使用下面的代碼寫入到卡夫卡:卡夫卡壓縮可以用相同的分區密鑰覆蓋消息嗎?

String partitionKey = "" + System.currentTimeMillis(); 
KeyedMessage<String, String> data = new KeyedMessage<String, String>(topic, partitionKey, payload); 

而且我們使用0.8.1.1版本卡夫卡的。

是否有可能的是,當多個線程編寫,他們中的一些(不同的有效載荷)用相同的分區鍵和寫,因爲卡夫卡覆蓋這些消息(由於同一partitionKey)?

這讓我們在這個方向思考的文檔是: http://kafka.apache.org/documentation.html#compaction

回答

2

聽起來非常有可能的。壓縮保存每個鍵的最後一條消息。如果您有多個消息共享一個密鑰,壓縮後只會保存最後一個消息。正常的用例是數據庫複製,其中只有最新的狀態是有趣的。

+0

謝謝格溫。但是你的回答看起來更像是一個應該如何而不是確認的建議。 我的問題更多的是關於數據沒有達到消費者,因爲壓實。日誌壓縮與消息傳遞不同嗎?日誌是否可能被壓縮,但客戶端仍然獲得具有相同密鑰的所有消息? 如果此功能僅在8.1 *版本中引入,則此更改是否與先前版本不兼容? – user2250246 2014-11-03 03:39:26

+1

1.日誌壓縮與消息傳遞不同。無論是否有人正在使用消息,壓縮都發生在服務器中。 – 2014-11-03 23:10:15

+2

2.如果客戶在寫完信息後立即讀取消息,它將在壓縮之前完成,他們將獲得所有消息。 – 2014-11-03 23:11:45

5

我發現了一些更多的材料在https://cwiki.apache.org/confluence/display/KAFKA/Log+Compaction

要點:

  1. 之前0.8版本,卡夫卡只支持單個保持 機制:刪除日誌的老段
  2. 登錄壓實提供了一種替代使其保持每個 唯一密鑰的最新條目,而不僅僅維護最近的日誌條目。
  3. 有一個per-topic選項可以選擇「刪除」或「緊湊」。
  4. 壓實保證每個關鍵是在 日誌尾部獨特。它通過從頭到尾重新複製日誌來工作,刪除在日誌中具有較晚發生的鍵。
  5. 任何停留在日誌頭部(〜1GB)的消費者都將看到所有消息。

因此,無論我們是否進行日誌壓縮,Kafka都會刪除較舊的記錄,但日誌頭部的記錄是安全的。

缺失的記錄,只有當下遊客戶端將無法清空卡夫卡會出現問題隊列很長一段時間(如每話題尺寸/時限被擊中)。

這應該是一個預期的行爲,我覺得既然我們不能保存記錄,直到永遠。他們必須被刪除一段時間或其他。