分布式消息服务RabbitMQ

使用AMQProxy解决PHP等客户端Connection复用问题

2024-06-27 02:58:33

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相关信息,请参见AMQProxy

部署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。格式为{amqp|amqps}://{endpoint}。

l  amqp:AMQP协议。不使用SSL连接时使用。

l  amqps:AMQP/SSL协议。使用SSL连接时使用。

l  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);


SO9emEk.Bx66