bunny-rest-proxy: 基於RabbitMQ的微服務非同步API

banq發表於2022-03-28

Bunny REST Proxy 是一個構建在 RabbitMQ 之上的 HTTP 訊息代理。它允許服務透過 HTTP 輕鬆地將訊息釋出到 RabbitMQ 佇列,並使用拉 (HTTP GET) 和推送 (HTTP POST 到訂閱者) 交付模式來使用訊息。
雖然 RabbitMQ 通常用作微服務之間的非同步通訊手段,但有時您需要使用更簡單的 REST API 釋出訊息或使用訊息,而不會影響訊息傳遞保證。
 
特徵
  • 透過 REST API 將訊息釋出到 RabbitMQ 佇列中,使用帶有釋出者確認的通道實現可靠的訊息傳遞
  • 支援二進位制和 JSON 訊息(帶有伺服器端模式驗證)
  • 透過 HTTP 將訊息推送到定義的訂閱者,確保至少一次交付語義,並具有可配置的退避策略和死信策略
  • 使用佇列中的訊息 HTTP GET 請求
  • 基於單個 YAML 檔案的直接配置


詳細點選標題
 
作者意圖與專案上下文背景:
使用AMQP連線並不總是方便/可行的,所以我最終在Node.js中建立了一個HTTP訊息代理(推/拉消費;至少一次/最多一次的語義),在RabbitMQ之上,有點類似於AWS SQS;Bunny REST Proxy

事後總結:

在最近的一個專案中,我正致力於將兩個現有的傳統Web應用程式、CRM系統和IoT裝置連線到一個基於微服務的後端,該後端使用RabbitMQ作為非同步通訊的手段。我很快就遇到了一個重要的問題,即從各種指令碼能力有限的地方釋出訊息(其中AMQP客戶端不可用,但HTTP客戶端可用)。雖然 RabbitMQ 的管理外掛暴露了一個允許釋出訊息的 HTTP API,但事實證明,它並沒有實現可靠的訊息傳遞。因此,在一些罕見的故障情況下,它有可能向客戶端傳送確認訊息交付的響應,儘管它並沒有在代理中持久化,這在分散式系統中是一個大忌,因為它的目標是實現至少一次的訊息交付語義。為了緩解這種情況,我決定用我最喜歡的堆疊(Fastify + Typescript)編寫一個簡單的 Node.js 應用程式,它將充當一個代理,暴露 REST API 以將訊息釋出到 RabbitMQ 佇列中。

在實現了一個用於將訊息釋出到 RabbitMQ 的赤裸裸的 REST 代理之後,我遇到了一些用例,在這些用例中,透過 HTTP GET 消費訊息或以類似 webhook 的方式將它們自動推送到 HTTP POST 端點是有益的。這時我決定將現有的Node應用變成一個開源專案。在實現了訂閱者和消費者之後,它基本上變成了一個建立在RabbitMQ之上的HTTP訊息代理。

到目前為止,Bunny REST Proxy具有一些更高階的功能,如6種不同的回退策略(用於延遲訊息交付重試)和3種不同的死信策略(指定如何處理超過最大交付重試次數的訊息)。在釋出者方面,它可以驗證訊息是否符合指定的模式(如果是JSON釋出者)。它還具有ACL風格的授權,可橫向擴充套件,其整個配置可由一個yaml檔案提供。
 

相關文章