2015-04-08 63 views
21

KeyedMessage<String, byte[]> keyedMessage = new KeyedMessage<String, byte[]>(request.getRequestTopicName(),SerializationUtils.serialize(message)); producer.send(keyedMessage);鍵是否需要爲發送消息的一部分,卡夫卡

目前,我發送消息,而維持密鑰的消息的一部分的任何鍵,將它仍然delete.retention.ms工作,我是否需要發送密鑰作爲消息的一部分?這是好的做鑰匙作爲消息的一部分

回答

49

如果你需要一個密鑰的強命令並且正在開發像狀態機一樣的密鑰,那麼密鑰是非常有用/必要的。如果您要求使用相同密鑰(例如,唯一ID)的消息始終以正確順序顯示,則將密鑰附加到消息將確保具有相同密鑰的消息始終轉到主題中的同一分區。卡夫卡保證在一個分區內的訂單,但不能跨主題的分區,所以或者不提供密鑰 - 這將導致跨分區的循環分配 - 不會保持這樣的順序。

對於狀態機,密鑰可以與log.cleaner.enable一起使用,以使用相同的密鑰對條目進行重複數據刪除。在這種情況下,Kafka假定您的應用程序只關心給定密鑰的最新實例,並且只有在密鑰不爲空時,日誌清除器纔會刪除給定密鑰的較早重複項。這種形式的日誌壓縮由log.cleaner.delete.retention屬性控制,並且需要密鑰。

或者,默認情況下啓用的更常用屬性log.retention.hours通過刪除日誌中已過期的完整段進行工作。在這種情況下,不必提供密鑰。卡夫卡只會刪除比給定保留期更早的日誌塊。

完全可以這樣說,如果您啓用了log compaction或要求使用相同密鑰的郵件嚴格排序,那麼您一定要使用密鑰。否則,在一些密鑰可能比其他密鑰更多出現的情況下,空密鑰可以提供更好的分佈並防止潛在的熱點問題。

+0

我是卡夫卡新手,這就是要問這麼多問題的原因:這裏有幾個問題:第一個問題,我們可以消費關鍵基礎上的消息,目前我正在消費來自MessagAndMetadata毫米的消息。或者在消費消息時忽略密鑰是好的。我正在使用Hig Level Consumer Api。 – gaurav

+0

@kuujo我假設這種重複數據刪除僅適用於日誌條目,它並不一定會對主題隊列中的消息進行重複刪除? – user1658296

+0

很好的答案。我把它和它聯繫起來我正在撰寫一份我正在研究的「最佳實踐」文檔(我爲一家與卡夫卡集成的公司工作)。這有助於我理解這個問題,謝謝。 –

相關問題