[英]How to AutoCreate Kafka Topic according to incoming topic pattern through kafkalistener service in springboot 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.