【问题标题】:AMQP/RabbitMQ consumer on NGINXNGINX 上的 AMQP/RabbitMQ 消费者
【发布时间】:2017-10-09 10:32:04
【问题描述】:

是否可以让 RabbitMQ 消费者通过 AMQP 协议监听消息队列。我知道 nginx 只支持 HTTP/s 协议。想知道这是否可以通过使用 tcp 模块扩展来实现。

我使用 nginx 作为 API 网关,并希望将协议从 AMQP 转换为 HTTP,因为所有后端服务都暴露在 HTTP 上。

【问题讨论】:

    标签: nginx rabbitmq amqp


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

    【讨论】: