0

我有一個分區主題,它有X分區。在Kafka中設計消息密鑰的最佳方式是什麼?

截至目前,在生成消息時,我創建了僅指定topicvalue的卡夫卡ProducerRecord。我沒有定義key。 據我所知,我的消息將使用默認的內置分區器在分區間均勻分配。 另一方面,我有一個卡夫卡消費者的線程池。每個卡夫卡消費者都將在自己的專用線程中運行消耗該主題的消息。這些消費者中的每一個都被賦予相同的group.id。這將允許消費並行消息。每個消費者將被分配公平份額的分區來讀取。

我希望我的消息有條不紊地被消費。我知道Kafka保證分區內的消息順序。所以,只要我想出了一個合適的密鑰結構,我就可以將我的消息進行分區,以便它們最終位於同一個分區中。在某種程度上,消息密鑰將消息分組並存儲在分區中。

它有道理嗎?

問:是否有機會由於設計錯誤的密鑰而導致分區不均勻?人們可能比其他人獲得更多的記錄。它是否會影響我的Kafka集羣的性能?消息密鑰設計的最佳實踐是什麼?

回答

1

您對默認分區程序的理解是正確的。

如果您沒有要求按照生成的順序使用某些消息的要求,則不指定密鑰是最佳選擇。如果這不是你的情況,那麼你的要求告訴你什麼是你的鑰匙。例如,如果要保留給定用戶生成的消息的順序,user_id可能是您的消息密鑰。

要實現特定的消息順序,您需要考慮生產者的配置方式。如果您的製作人可以在發生故障的情況下重試發送郵件,並且in flight messages大於1,則可以無序地生成郵件。

通過指定壞密鑰可以獲得不均勻的分區。例如,如果90%的用戶來自紐約,10%來自其他城市,並且您選擇城市作爲關鍵字,那麼您的其中一個分區將是巨大的,並且其中一個消費者超載(我假設消息的數量每個用戶是相同的)。

+0

你已經提到過,消息的順序可能取決於生產者的配置方式,是否配置失敗嘗試後重試。是否有Kafka生產者配置參數?或重試策略是必須通過應用程序代碼進行思考和實施的嗎? –

0

Kafka將在密鑰上應用雜音哈希,並對分區數量進行模數,以便它即murmur2(record.key()))%num分區。在所有可能的情況下,它應該在默認分區的情況下均勻分佈。我建議你用java編寫的一個簡單的murmur2函數來實驗你的所有關鍵選項,以查看分佈模式,然後做出選擇。 在kafka中還有兩個默認分區的實現。 Murmur哈希實現是新版本。舊的舊版本工作方式不同。

+0

我會認爲奇怪是無關緊要的。 – alf

+0

感謝您指出..同意你..編輯我的回答 – Swapnil

相關問題