amqproxy 一個很不錯的rabbitmq proxy


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM