amqproxy 是由cloudamqp公司開源的(此公司專門搞rabbitmq 服務的)開發基於crystal(一個小眾語言,但是很不錯),
同時今天也轉了一片此公司的文章 https://www.cloudamqp.com/blog/2019-05-29-maintaining-long-lived-connections-with-AMQProxy.html
以下是一個簡單的環境搭建以及測試
環境准備
- docker-compose文件
集成了prometheus 監控以及amqproxy,包含了兩個實例
version: "3"
services:
vmstorage:
image: victoriametrics/vmstorage
ports:
- 8482:8482
- 8400:8482
- 8401:8482
volumes:
- ./strgdata:/storage
command:
- "--storageDataPath=/storage"
vmagent:
image: victoriametrics/vmagent
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 8429:8429
command:
- -promscrape.config=/etc/prometheus/prometheus.yml
- -remoteWrite.url=http://vminsert:8480/insert/1/prometheus
vminsert:
image: victoriametrics/vminsert
command:
- "--storageNode=vmstorage:8400"
ports:
- 8480:8480
vmselect:
image: victoriametrics/vmselect
command:
- "--storageNode=vmstorage:8401"
ports:
- 8481:8481
grafana:
image: grafana/grafana
ports:
- 3000:3000
rabbitmq:
build: ./
hostname: 1-rabbit
ports:
- "5672:5672"
- "15672:15672"
- "15692:15692"
environment:
- "RABBITMQ_DEFAULT_USER=dalong"
- "RABBITMQ_DEFAULT_PASS=dalong"
- "RABBITMQ_NODENAME=rabbit@1-rabbit"
rabbitmq2:
build: ./
hostname: 2-rabbit
ports:
- "5674:5672"
- "15674:15672"
- "15694:15692"
environment:
- "RABBITMQ_DEFAULT_USER=dalong"
- "RABBITMQ_DEFAULT_PASS=dalong"
- "RABBITMQ_NODENAME=rabbit@2-rabbit"
amqpproxy:
image: dalongrong/amqpproxy:master
ports:
- "5673:5673"
environment:
- "AMQP_URL=amqp://rabbitmq2:5672"
- prometheus 配置
基於vmagent
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: 'rabbitmq-without'
static_configs:
- targets: ['rabbitmq:15692']
- job_name: 'rabbitmq-with-amqproxy'
static_configs:
- targets: ['rabbitmq2:15692'
- Dockerfile
添加了prometheus 支持
FROM rabbitmq:3.8.5-management-alpine
RUN rabbitmq-plugins enable --offline rabbitmq_prometheus
- amqproxy 配置
這個很簡單,基於官方的dockerfile 構建的,主要是AMQP_URL(注意此curl 不需要用戶名以及密碼)
environment:
- "AMQP_URL=amqp://rabbitmq2:5672"
代碼集成使用
- nodejs 代碼
package.json
{
"name": "app",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"amqplib": "^0.5.6"
},
"scripts": {
"mq:start1": "node app.js",
"mq:start2": "node app2.js",
"run-all":"npm-run-all --parallel mq:**"
},
"devDependencies": {
"npm-run-all": "^4.1.5"
}
}
app.js 代碼
var q = 'tasks';
var open = require('amqplib').connect('amqp://dalong:dalong@127.0.0.1:5672');
// Publisher
open.then(function(conn) {
return conn.createChannel();
}).then(function(ch) {
ch.assertQueue(q).then(function(ok) {
for (var i = 0; i <50000;i++){
ch.sendToQueue(q, Buffer.from('something to do'));
}
});
}).catch(console.warn);
// Consumer
open.then(function(conn) {
return conn.createChannel();
}).then(function(ch) {
return ch.assertQueue(q).then(function(ok) {
return ch.consume(q, function(msg) {
if (msg !== null) {
console.log(msg.content.toString());
ch.ack(msg);
}
});
});
}).catch(console.warn);
說明
具體的使用和普通rabbitmq 鏈接是一樣的,具體amqproxy的優點可以參考上邊的鏈接,關於promehteus 的集成使用,可以直接添加官方的fdashboard
參考資料
https://www.cloudamqp.com/blog/2019-05-29-maintaining-long-lived-connections-with-AMQProxy.html
https://github.com/rongfengliang/rabbitmq-amqproxy-prometheus-learning
https://grafana.com/orgs/rabbitmq