2017-10-09 482 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中这样做。这绝对是最好和最受支持的解决方案。