AMQProxy是一款开源AMQP代理服务,具备复用AMQP Connection的能力。可以通过该代理服务使原本只能使用短连接的客户端(例如PHP客户端)使用长连接,从而减少网络资源消耗和分布式消息服务RabbitMQ资源消耗。
前提条件
如果您要使用SSL连接AMQProxy和分布式消息服务RabbitMQ,请确保您的客户端服务器已安装OpenSSL。
背景
部分语言的客户端,例如PHP客户端,无法使用长连接,会频繁地开启或关闭Connection,消耗大量的网络资源和分布式消息服务RabbitMQ资源,从而对分布式消息服务RabbitMQ造成巨大压力。
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。
部署AMQProxy
(1)下载和安装AMQProxy。
开源项目地址:https://github.com/cloudamqp/amqproxy
releases目录下有安装包,下载后可以在本地解压
(2)启动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。格式为{amqpIamqps}://{endpoint}。 amqp:AMQP协议。不使用SSL连接时使用。 amqps:AMQP/SSL协议。使用SSL连接时使用。 endpoint:分布式消息服务RabbitMQ实例的接入点。可以在分布式消息服务RabbitMQ控制台的实例详情页面查看。 |
示例命令如下:
./amqproxy -l 127.0.0.1 -p 5673 amqps://192.168.0.100:5672
返回示例如下:
Proxy upstream: 192.168.0.100:5672 TLS
Proxy listening on 127.0.0.1:5673
0 clients 0 upstreams
参数 | 描述 |
---|---|
clients | 客户端和AMQProxy的Connection数量。 |
upstreams | AMQProxy和分布式消息服务RabbitMQ实例的Connection数量。 |
(3)在客户端代码中将Host和端口修改为AMQProxy IP地址和监听端口。
factory.setHost("127.0.0.1");
factory.setPort(5673);