簡體   English   中英

建議在同一應用程序中運行 Kafka 生產者 + 消費者?

[英]Advisable to run a Kafka producer + consumer in same application?

Spring + Apache 卡夫卡菜鳥在這里。 我想知道是否建議運行單個 Spring 引導應用程序來處理生成消息和使用消息。

我最近看到的許多使用 Kafka 的應用程序通常有一個單獨的應用程序將消息發送/發送到 Kafka 主題,另一個應用程序使用/處理來自該主題的消息。 對於較大的應用程序,我可以看到單獨的生產者和消費者應用程序的情況,但是較小的應用程序呢?

例如:我是一個簡單的應用程序,處理 HTTP 請求 => 將請求發送到第三方服務,但為了確保可重試性,我將請求放在 Kafka 隊列中,並使用@Retryable注釋提供服務?

由於它在 Spring 框架上,還有哪些其他考慮因素可能會起作用?

注意:正如您的問題所述,我要說的更多是基於我的信念和經驗的建議,而不是一些一成不變的絕對真理。

您的用例看起來更像是proxy ,而不是具有業務邏輯的實際應用程序。 你應該確保使它成為一個異步服務是有意義的 - 也許它足以保持連接直到你從 3p 得到響應,並且如果你收到錯誤讓你的客戶端處理重試 - 當然,你也可以重試直到超時。

這將避免常見的異步問題,例如讓您的客戶端需要poll或使用webhook以獲得結果,或者確保記錄在中斷或高消耗后經過很長時間后仍然可以處理落后。

如果您的客戶只要完成就不會關心結果,並且您不期望任何一方都有高吞吐量,那么單個Spring Boot應用程序應該足以處理生產者和消費者方面 - 同時還保持它簡單的。

如果您確實期望高吞吐量,我會研究使用reactor-kafka庫構建基於WebFlux的應用程序——高吞吐量代理是reactive applications的絕佳用例。

另一種選擇是擁有一個簡單的serverless function來處理http請求並生成記錄,以及一個標准的Spring Boot應用程序來使用它們。

TBH,我沒有看到一個用例,其中有兩個成熟的 java 應用程序來處理代理職責會得到回報,除非你有一個非常完善的基礎設施來輕松管理它們,否則有兩個應用程序不會有什么不同而不是一個,使用更多資源不是問題。

實際上,如果您期望真正的高流量並且serverless function不起作用,或者您可能想堅持使用基於 Java 的解決方案,那么您可以有一個簡單的基於WebFlux的應用程序來處理http請求並發送消息,並且一個標准的Spring Boot或另一個WebFlux應用程序來處理消費。 這樣您就可以擴展前者以適應高流量,並根據您的性能要求獨立擴展后者。

至於重試部分,如果您堅持使用非反應性Spring Kafka應用程序,您可能需要查看Spring Kafka的非阻塞重試功能 這將使您的消費者應用程序能夠在等待重試失敗的記錄時處理其他記錄 - @Retryable方法已被棄用,取而代之的是DefaultErrorHandler並且兩者都將在等待時阻止消費。

請注意,這樣您就失去了順序保證,因此只有在處理請求的順序不重要時才使用它。

暫無
暫無

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

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