簡體   English   中英

如何根據給定的主題順序concume kafka主題

[英]How to concume kafka topic according to a given topic order

目前,我面臨一個問題,我需要根據給定的指定順序使用來自不同主題的數據。 假設我們有 3 個主題,分別稱為 topic-1、topic-2 和 topic-3。 首先,我需要確保按以下順序使用主題。

topic-2 > topic-3 > topic-1

應用程序應該偵聽並讀取 topic-2 中的所有消息,然后它應該繼續從 topic-3 和 topic-1 消費。 再次需要這樣做,直到主題收到消息。

卡夫卡有可能嗎?

我不確定您是否有任何特殊限制,但您可以嘗試在您的應用程序代碼中執行此操作:

consumeAll(topic2); // when done, consume next topic
consumeAll(topic3); // when done, consume next topic
consumeAll(topic1); 

但請注意:如果新消息“同時”附加到多個主題,您將無法在應用程序代碼中重新創建插入順序,因為 Kafka 僅保證單個主題區內的順序,而不是跨多個分區或多個主題。

您可以使用時間戳,它必須嵌入到 Kafka 消息中。 所以你可以知道哪個先出現:

{ messageId, payload, timestamp }

使用時間戳意味着您的所有生產者都必須使用同步時鍾。 否則,您可能會出現幾毫秒的漂移,並且正確的順序消失了。

但是接下來您會遇到下一個問題:您希望在開始處理之前等待多長時間? (例如,如果 topic3 沒有收到新消息)

另一件需要考慮的事情:您收到來自 topic3 的新消息。 現在應該怎么辦? 根據您的描述,您無法處理它,因為首先必須有一些來自 topic2 的消息。 您想等待來自 topic2 的新消息多長時間?

雖然也許最好只聽topic2。 只有當您收到來自 topic2 的消息時,您才會開始從 topic3 獲取消息。 當你從 topic3 得到一些東西時,你開始聽 topic1。 然后重新開始。

像這樣的東西:

while(true) {
  msg2 = consumeAllNewMessages(topic2); // blocking call, until message received
  msg3 = consumeAllNewMessages(topic3); // blocking, too
  msg1 = consumeAllNewMessages(topic1); // blocking, too

  process(msg2, msg3, msg1);
}

(當然你可以(並且應該)用一些非阻塞代碼替換阻塞調用,例如使用 CompletableFuture)

但同樣:這只會保證您使用這些主題的順序。 但它並沒有告訴您這些消息(跨主題)以什么順序發送到 Kafka。 這需要具有同步時鍾的嵌入式時間戳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM