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。
開源項目地址://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);