是否可以让RabbitMQ Consumer通过AMQP协议侦听消息队列。我知道nginx只支持HTTP / s协议。想知道是否可以通过使用tcp模块扩展来实现这一点。
我使用nginx作为API网关,并希望从AMQP到HTTP进行协议转换,因为所有后端服务都在HTTP上公开。
答案 0 :(得分:1)
绝对可以编写自己的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。再次,你将失去每个有状态的功能(如基本消费,确认/拒绝/拒绝),但这本身就是由于HTTP的设计方式。
最后,如果你真的需要一个RabbitMQ“基本”消费者,我会建议你把一个合适的消费者写成一个单独的应用程序而忘记在nginx中这样做。这绝对是最好和最受支持的解决方案。