AMQProxy
一个智能的AMQP代理,具有AMQP连接和通道池化/重用功能。允许例如PHP客户端保持与上游服务器的长期连接,将发布速度提高一个数量级或更多。
在AMQP协议中,如果你打开一个连接,客户端和服务器必须交换7个TCP包。如果你想发布一条消息,你还需要打开一个通道,这需要再多2个包,然后进行发布至少需要再多1个包,最后优雅地关闭连接需要再多4个包。总共15个TCP包,如果使用AMQPS(TLS)则需要18个。对于因各种原因无法与服务器保持长期连接的客户端来说,这会造成相当大的延迟影响。
如果将这个代理服务器运行在与客户端相同的机器上,可以节省所有这些延迟。当客户端连接到代理时,代理会使用客户端提供的凭据打开一个到上游服务器的连接。AMQP流量随后在客户端和服务器之间转发,但当客户端断开连接时,代理会拦截通道关闭命令,并在上游服务器上保持通道开放(如果认为安全)。下次客户端连接(使用相同的凭据)时,与上游服务器的连接将被重用,因此无需再进行打开和协商AMQP连接或打开并等待通道打开的TCP包交换。
只有"安全"的通道会被重用,即只发生过Basic Publish或Basic Get(带no_ack)的通道。任何已订阅队列的通道在客户端断开连接时都会被关闭。然而,与上游AMQP服务器的连接始终保持打开状态并可以被重用。
在我们的基准测试中,对一个往返延迟为50ms的服务器(使用TLS)每个连接发布一条消息,使用代理平均需要10ms,而不使用代理则需要500ms。你可以在这里阅读更多关于代理的信息:使用AMQProxy维护长期连接
从2.0.0版本开始,与服务器的连接可以被多个客户端连接共享。当客户端打开一个通道时,它将在共享的上游连接上获得一个通道,代理会在两者之间重新映射通道号。因此,许多客户端连接可以共享一个上游连接。这样做的好处是与上游服务器所需的连接数量大大减少。例如,在服务器重启后建立10,000个连接通常可能需要几分钟,但使用这个代理可以在几秒钟内完成。
安装
Debian/Ubuntu
可以在Packagecloud上获取安装包。使用以下命令安装最新版本:
curl -fsSL https://packagecloud.io/cloudamqp/amqproxy/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/amqproxy.gpg > /dev/null
. /etc/os-release
echo "deb [signed-by=/usr/share/keyrings/amqproxy.gpg] https://packagecloud.io/cloudamqp/amqproxy/$ID $VERSION_CODENAME main" | sudo tee /etc/apt/sources.list.d/amqproxy.list
sudo apt-get update
sudo apt-get install amqproxy
如果需要安装特定版本,请使用以下命令:
sudo apt install amqproxy=<版本号>
。这适用于升级和降级。
Docker/Podman
Docker镜像发布在Docker Hub上。使用以下命令获取并运行最新版本:
docker run --rm -it -p 5673:5673 cloudamqp/amqproxy amqp://SERVER:5672
注意:如果你在localhost上运行上游服务器,则需要在docker run命令中添加--network host
标志。
然后从你的AMQP客户端连接到localhost:5673,它将重用与上游服务器建立的连接。AMQP_URL应只包含协议、主机名和端口(仅当非默认端口时,AMQP为5672,AMQPS为5671)。任何用户名、密码或vhost将被忽略,由客户端提供。
安装(从源码)
shards build --release --production
cp bin/amqproxy /usr/bin
cp extras/amqproxy.service /etc/systemd/system/
systemctl enable amqproxy
systemctl start amqproxy
你可能需要修改/etc/systemd/system/amqproxy.service
并配置另一个上游主机。
配置
可用设置
设置 | 描述 | 命令行选项 | 环境变量 | 配置文件设置 | 默认值 |
---|---|---|---|---|---|
监听地址 | 要监听的地址。这是客户端将连接的主机名/IP地址 | --listen / -l | LISTEN_ADDRESS | [listen] > address 或 [listen] > bind | localhost |
监听端口 | 要监听的端口。这是客户端将连接的端口 | --port / -p | LISTEN_PORT | [listen] > port | 5673 |
日志级别 | 控制日志详细程度。 可用级别(参见 84codes/logger.cr): - DEBUG :开发人员的低级信息- INFO :系统操作的通用(有用)信息- WARN :警告- ERROR :可处理的错误条件- FATAL :导致程序崩溃的不可处理错误 | --debug / -d :将级别设置为 DEBUG | - | [main] > log_level | INFO |
空闲连接超时 | 未使用的池化连接保持打开状态的最长时间(秒) | --idle-connection-timeout / -t | IDLE_CONNECTION_TIMEOUT | [main] > idle_connection_timeout | 5 |
上游 | 指向代理应连接的上游RabbitMQ服务器的AMQP URL。可能只包含方案、主机和端口(可选)。示例:amqps://rabbitmq.example.com | 在所有选项之后作为参数传递 | AMQP_URL | [main] > upstream |
如何配置
有三种方式配置AMQProxy:
- 环境变量
- 通过命令行传递选项和参数
- 用法:
amqproxy [选项] [amqp上游url]
- 上表中未提到的其他选项:
--config
/-c
:加载指定路径的配置文件--help
/-h
:显示帮助信息--version
/-v
:显示AMQProxy版本
- 用法:
- 配置文件
- 你可以在config/example.ini找到一个示例
优先级
- 配置文件
- 命令行选项和参数
- 环境变量
配置文件中可用的设置将覆盖相应的命令行选项。命令行选项将覆盖相应的环境变量。依此类推。 不同的配置方法也可以混合使用。