2017-08-12 9 views
1

卡夫卡初學者。按照順序向卡夫卡發送不同消息類型的良好做法

我想讓一個python生產者發送A類型的消息(json),然後是B類型消息。爲了更新數據庫,java消費者必須使用它們來保持這個順序。

我的第一個想法是使用單個主題來保證消息的順序。我讀這些問題的答案:

但它似乎不是卡夫卡一個很好的做法,使用不同的對象類型一個話題?

因此,另一個解決方案更多「kafkaesque」有兩個主題,這個問題。但是有沒有辦法讓製作人確定在發送第二個主題之前第一個主題中的所有信息都已被使用?我會失去異步嗎?

在您看來,這種配置的最佳策略是什麼?

謝謝。

+0

B的所有事件都必須在A或某些通氣孔後讀取ob B可以在A的某些事件後讀取嗎? – marvel308

+0

感謝您的問題@ marvel308。理想情況下,所有B事件之後的事件都是A. –

回答

4

訂單未保留在多個主題或多個分區中,因此您需要將所有消息發送到該主題中的一個主題和一個分區。

不要擔心發送不同的數據類型到同一主題,除非您使用Avro或其他一些強化每個主題一致模式的序列化程序。如果您發送JSON,那麼單個主題就沒有問題。

請務必注意,訂單不會跨主題的多個分區保留。如果你的話題有一個分區,那麼你很好。如果您的主題有多個分區,那麼當您發佈並使用相同的密鑰來處理需要保留的所有消息時,您應該使用密鑰。這將確保它們全部進入相同的分區。

如果您想確保訂單得到保留,您應該設置max.inflight.requests.per.connection=1。否則,一條消息的錯誤和重試可能會使其從其他機上消息中排除。

+0

謝謝你的回答漢斯。我選擇了一個JsonDeserializer作爲我的Java/Spring消費者的值解串器。而且我將有效載荷包裝在一個包含「類型」的對象中,以知道如何將值轉換爲接收器中的良好對象類型。 –

+0

訂單僅保存在一個分區中。第一句話讓人有點困惑。 – PragmaticProgrammer

+0

修改爲較少混淆 –