AMQProxy是一款开源AMQP代理服务,具备复用AMQP Connection的能力。您可以通过该代理服务使原本只能使用短连接的客户端(例如PHP客户端)使用长连接,从而减少网络资源消耗和消息队列RabbitMQ版资源消耗。

前提条件

如果您要使用SSL连接AMQProxy和消息队列RabbitMQ版,请确保您的客户端服务器已安装OpenSSL。更多信息,请参见Downloads
注意 VPC环境下不支持使用SSL连接消息队列RabbitMQ版

背景信息

部分语言的客户端,例如PHP客户端,无法使用长连接,会频繁地开启或关闭Connection,消耗大量的网络资源和消息队列RabbitMQ版资源,从而对消息队列RabbitMQ版造成巨大压力。

dg_AMQP Proxy_1

AMQProxy

AMQProxy是Cloud AMQP提供的开源AMQP代理服务。客户端可以通过该代理服务与消息队列RabbitMQ版保持长连接。当您在客户端服务器部署AMQProxy后,客户端和消息队列RabbitMQ版之间的请求都会先发送到AMQProxy,然后由AMQProxy转发到对方。

AMQProxy处理客户端发起的Connection相关请求的逻辑如下:

  • 如果客户端发送开启Connection的请求,AMQProxy将根据用户名、密码、Vhost查找当前是否有合适的Connection可以复用,如果有就复用该Connection,如果没有就由AMQProxy代替客户端和消息队列RabbitMQ版开启Connection。
  • 如果客户端发送关闭Connection的请求,AMQProxy会直接应答OK,但并不会关闭与消息队列RabbitMQ版的Connection,当该客户端下次再请求开启Connection时,AMQProxy会直接使用该Connection。
dg_AMQP Proxy_2

更多AMQProxy相关信息,请参见AMQProxy

部署AMQProxy

  1. 执行以下命令下载AMQProxy压缩包。
    wget https://github.com/cloudamqp/amqproxy/releases/download/v0.4.4/amqproxy-0.4.4-1.linux-x86_64-static.tar.gz
    说明 本文以AMQProxy 0.4.4为例。更多AMQProxy版本,请参见Releases
  2. 执行以下命令解压AMQProxy压缩包。
    tar -xzvf amqproxy-0.4.4-1.linux-x86_64-static.tar.gz
  3. 执行以下命令进入AMQProxy文件夹。
    cd amqproxy/
  4. 执行以下命令启动AMQProxy。
    ./amqproxy -l LISTEN_ADDRESS -p LISTEN_PORT AMQP_URL
    参数 描述
    LISTEN_ADDRESS AMQProxy IP地址。由于是在客户端服务器部署AMQProxy,因此您可以直接使用本机地址127.0.0.1
    LISTEN_PORT AMQProxy监听端口。客户端请求通过该端口发送到AMQProxy。该端口可以为任何可用的端口,例如5673。
    AMQP_URL 消息队列RabbitMQ版实例的URL。格式为{amqp|amqps}://{endpoint}
    • amqp:AMQP协议。不使用SSL连接时使用。
    • amqps:AMQP/SSL协议。使用SSL连接时使用。
    • endpoint消息队列RabbitMQ版实例的接入点。您可以在消息队列RabbitMQ版控制台的实例详情页面查看。更多信息,请参见查看实例详情
    示例命令如下:
    ./amqproxy -l 127.0.0.1 -p 5673 amqps://188XXX420.mq-amqp.cn-hangzhou-a.aliyuncs.com
    返回示例如下:
    Proxy upstream: 188XXX420.mq-amqp.cn-hangzhou-a.aliyuncs.com:5671 TLS
    Proxy listening on 127.0.0.1:5673
    0 clients                0 upstreams
    参数 描述
    clients 客户端和AMQProxy的Connection数量。
    upstreams AMQProxy和消息队列RabbitMQ版实例的Connection数量。
  5. 在客户端代码中将Host和端口修改为AMQProxy IP地址和监听端口。
    factory.setHost("127.0.0.1");
    factory.setPort(5673);