事件驅動架構有助於系統回應現實生活中的事件,例如當用戶的個人資料被更新時。本文說明了如何構建反應式事件驅動應用程序,通過結合Spring WebFlux、Apache Kafka和死信隊列來處理數據丟失。當這些技術一起使用時,它們提供了創建容錯、具有彈性和高性能系統的框架,對於需要高效處理大量數據的大型應用程序至關重要。
本文中使用的功能
- Spring Webflux:它提供一個反應式範式,依賴非阻塞背壓來同時處理事件。
- Apache Kafka:反應式Kafka生產者和消費者有助於構建高效和適應性的處理管道。
- 反應式流:它們不會阻塞Kafka生產者和消費者的流程執行。
- 死信隊列(DLQ):DLQ暫存未能處理的訊息,原因有各種。DLQ訊息可以稍後再處理,以防止數據丟失並使事件處理具有彈性。
反應式Kafka生產者
一個 反應式 Kafka 生產者能夠並行推送消息,並且在發布時不會阻塞其他線程。這對於需要處理大量數據的情況非常有利。它與 Spring WebFlux 結合良好,並能在微服務架構中處理背壓。這種整合不僅有助於處理大量消息,還能有效管理雲資源。
上述的反應式 Kafka 生產者可以在 GitHub 上找到。
反應式 Kafka 消費者
反應式 Kafka 消費者能夠在不阻塞的情況下拉取 Kafka 消息,並維持高吞吐量。它還支持背壓處理,並與 WebFlux 完美整合,以實現實時數據處理。反應式消費者管道能夠良好地管理資源,非常適合在雲中部署的應用程序。
上述的反應式 Kafka 消費者可以在 GitHub 上找到。
死信隊列 (DLQ)
一個DLQ是一個簡單的Kafka主題,用於存儲由生產者發送但未能處理的消息。在實時情況下,我們需要系統保持功能正常,無阻塞和失敗,這可以通過將這些消息重定向到死信隊列來實現在事件驅動架構中。
死信隊列集成的好處
- 它提供了一個回退機制,以防止消息流程中斷。
- 它允許保留未處理的數據,有助於防止數據丟失。
- 它存儲失敗的元數據,最終有助於分析根本原因。
- 它提供多次重試以處理未處理的消息。
- 它解耦錯誤處理並使系統具有彈性。
失敗的消息可以從生產者代碼中推送到DLQ,如下所示:
如下所示,在反應式消費者中需要創建一個DLQ處理程序:
結論
將DLQ與反應式生產者和消費者結合有助於構建具有彈性、容錯和高效的事件驅動應用程序。反應式生產者確保非阻塞式消息發布;另一方面,反應式消費者通過背壓處理消息,提高了響應能力。DLQ提供了後備機制,防止中斷並防止數據丟失。
上述架構確保系統故障的隔離並有助於調試,進一步改進應用程序。
上述參考代碼可以在GitHub生產者和GitHub消費者中找到。
有關反應式生產者和消費者的更多詳細信息,請查看ReactiveEventDriven。Spring Apache Kafka文件提供有關DLQ的更多信息。
Source:
https://dzone.com/articles/reactive-event-driven-app-with-dead-letter-queue