-1

我創建了一個訂閱兩個主題TopicA和TopicB的客戶。 當消費者收到來自TopicA的消息時,我的業務邏輯是將ObjectA存儲到MySQL中。 當消費者收到來自TopicB的消息時,我的業務邏輯是更新ObjectA。主題之間的卡夫卡依賴關係

但是現在的問題是: TopicA和TopicB是相互獨立的。 消費者可能會先收到來自TopicB的消息,然後收到TopicA的消息。 當試圖更新ObjectA時,我發現它不存在於mysql中,然後拋出一個NullPointerException異常。

有什麼辦法來配置TopicA和TopicB以確保消息從TopicA接收的第一,然後從TopicB接收。

換句話說,我怎樣才能使主題之間的依賴關係?

+0

數據如何發送到TopicA和TopicB?數據是否保證在TopicB之前發送給TopicA,而您只是想按照正確的順序閱讀它?或者可以在TopicA之前將數據發送到TopicB,並且您只是想確保TopicA在TopicB之前位於TopicB中? – morganw09dev

+0

爲什麼你需要兩個不同的主題?只需使用一個插入對象的主題即可。 –

+0

如果主題分區爲1,則使用一個主題可以解決我的問題。但對於更多的分區,它仍然無法正常工作。 – fcbflying

回答

1

所有卡夫卡消費消息和基於偏移量產生消息。卡夫卡主題能夠提供的唯一一件事就是保證您可以按照寫給卡夫卡的順序使用郵件。您可以控制從某個主題中消費的速度,但您可以訪問的唯一信息是您所在每個主題的偏移量。

話說,在這裏你需要TopicA和TopicB之間的相關性似乎並不只可執行使用卡夫卡您的使用案例。

如果消息保證在TopicB之前寫入TopicA。您可能會想出一個解決方案,將兩條消息寫入同一主題,並且您第一次看到將其存儲在MySQL中的特定消息時,以及第二次更新它時。

+0

非常感謝。其實我已經做了一些你所說的話題。但我不認爲這是一個更好的解決方案。也許我應該改變我的設計。 – fcbflying

+0

當我使用名爲'MyTopic'的相同主題時,另一個問題是每個主題有兩個分區,並且可能消費者A的這個結果接收到帶有'MyTopic'的消息來首先更新它,然後另一個消費者接收到具有相同消息的消息主題來創建對象。似乎只有一個分區中的主題才能將接收順序保留爲發佈順序。例如,我首先發布'test message1',然後將'test message2'發佈到主題'Test'。如果主題具有兩個分區,首先接收'測試消息2',然後消費者B接收'測試消息1'。 – fcbflying