2017-10-09 175 views
0

是否有可能讓RabbitMQ Consumer通過AMQP協議偵聽隊列中的消息。我知道nginx只支持HTTP/s協議。想知道這是否可以通過使用TCP模塊擴展來實現。NGINX上的AMQP/RabbitMQ消費者

我正在使用nginx作爲API網關,並且希望執行從AMQP到HTTP的協議轉換,因爲所有後端服務都在HTTP上公開。

回答

0

肯定有可能編寫自己的C擴展。 nginx是suitable for TCP proxying,所以我看不出有什麼理由不能使用nginx將你自己的TCP數據包發送到RabbitMQ,因此使用nginx作爲RabbitMQ使用者。使其運行可能需要很多工作,甚至更多的工作使其穩定可靠,但是可行。請幫我一個忙,不要這樣做。總會有更好,更優雅,更簡單的解決方案。

HTTP絕對不適合從隊列中消費(在amqp意義上),因爲在使用時必須保持套接字打開。但是,您可以編寫一個C擴展來發布/從RabbitMQ檢索消息(顯然,somebody has already done this)。如果你對C不太熟悉,或者不想維護你自己的nginx包,你也可以爲lua-nginx-module編寫一個LUA擴展(再次,somebody seems to have worked in this direction)。這些是從nginx與MQ交談的PoC,但它們不是消費者。這兩個擴展似乎都在HTTP上下文中運行,所以你需要很快地回答(並關閉套接字)。

然而,據我所知,沒有任何社區驅動和維護良好的項目直接或間接地爲此目的服務;你必須建立和維護你自己的分機/客戶端。而且,nginx是你當前的API網關。請考慮風險。事情可能會變得非常錯誤。只有你可以判斷這是否值得這個麻煩,但這很可能不是。

由於您沒有給出有關您正在尋找的內容的很多信息,我只是在NGINX/AMQP部分回答了您。但你可能只是在尋找RabbitMQ的HTTP接口。在這種情況下,Management Plugin可能是要走的路。它有一個很酷的HTTP API。再一次,你會失去每個有狀態的特性(如基本消費,ack/nack/rejects),但這固有地歸因於HTTP的設計方式。最終,如果你真的需要一個RabbitMQ「basic-」消費者,我建議你寫一個合適的消費者作爲一個單獨的應用程序,並忘記在nginx中這樣做。這絕對是最好和最受支持的解決方案。