集群监控

RabbitMQ 扩展的 RabbitMQ Management 插件 就能提供一定的监控功能,Web 管理界面提供了很多的统计值信息 : 如发送速度、 确认速度、消费速度、消息总数、磁盘读写速度、句柄数 、 Socket 连接数、 Connection 数、 Channel 数、内存信息等

通过 HTTPAPI 接口提供监控数据

RabbitMQ Management 插件不仅提供了 一个优秀的 Web 管理界 面,还提供了盯TP API 接口以供调用 。

通过 http 方式获取 RabbitMQ 队列消息数量

RabbitMQ 实战指南-学习笔记4_代码段

#encoding: utf-8
#summary: 获取 RabbitMQ 中3种状态消息的数量

import os, sys, time
import requests
import json

class RabbitMQTool(object):
def __init__(self, host, vhost, queue, user, passwd):
self.host = host
self.vhost = vhost
self.queue = queue
self.user = user
self.passwd = passwd

# 返回3种消息数量:ready, unacked, total
def getMessageCount(self):
url = 'http://%s:15672/api/queues/%s/%s' % (self.host, self.vhost, self.queue)
r = requests.get(url, auth=(self.user, self.passwd))
print(r)
if r.status_code != 200:
return -1

dic = json.loads(r.text)

return dic['messages_ready'], dic['messages_unacknowledged'], dic['messages']

if __name__ == '__main__':
mqTool = RabbitMQTool(host = '192.168.0.xx',
vhost = 'vhost_walker',
queue = 'queue_walker',
user = 'walker',
passwd = 'walker')

ready, unacked, total = mqTool.getMessageCount()

print('ready: %d' % ready)
print('unacked: %d' % unacked)
print('total: %d' % total)

RabbitMQ管理HTTP API-链接参考文档
​​​RabbitMQ管理HTTP API​

检测 RabbitMQ 服务是否健康

虽然可以通过某些其他工具或方法来检测 RabbitMQ 进程是否在运行(如 ps aux I grep rabbitmq) ,或者 5672 端口是否开启(如 telnet xxx.xxx . xxx . xxx 5672) ,但是这样依旧不能真正地评判 RabbitMQ 是否还具备服务外部请 求的能力。这里就需要使用 AMQP 协议来构建一个类似于 TCP 协议中的 Ping 的检测程序。当 这个测试程序与 RabbitMQ 服务无法建立 TCP 协议层面的连接,或者无法构建 AMQP 协议层面 的连接,再或者构建连接超时时,则可判定 RabbitMQ 服务处于异常状态而无法正常为外部应 用提供相应的服务

将做工程过程中重要的一些代码段收藏起来,下面代码段是关于python检测RabbitMQ的状态是否正常的代码。

import socket

def check_aliveness(ip, port):
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.settimeout(1)
try:
sk.connect((ip,port))
print 'service is OK!'
return True
except Exception:
print 'service is NOT OK!'
return False
finally:
sk.close()
return False

check_aliveness('127.0.0.1', 15672)
元数据管理与监控

删除一个队列或交换器、或者修改了绑定信息、胡乱建立了一个队列绑定到现有交换器、没有消费者订阅消费此队列导致消息堆积
提供给业务方使用的用户只有可读和可写权限,收回配置权限

是 queues 、exchanges 和 bindings ,可以分别建立三张表。

  1. Table 1: 队列信息表,名称为 rmq_queues 。列名有 name 、 vhost 、 durable 、 auto_delete、 arguments 、 cluster_name 、 description ,其中 name、 durable 、 auto delete 、 arguments 可以参考 3.2.2 节中的内容 。 vhost 表示虚拟主机。 cluster_name 表示队列所在的集群名称,毕竟一般一个公司所用的RabbitMQ 集群井非 只有一个。 description 是相应的描述信息,相当于备注,通常可置为空 。
  2. Table 2: 交换器u信息表,名称为 rmq_exchanges 。列名有 name、 vhost 、 type、 durable 、 auto_delete , internal , arguments 、 cluster name 、 description 。 其中 name、 type 、 durable 、 auto delete 、 internal 、 arguments 可参考 3.2.1 节中的内容。 vhost 、 cluster 口ame 和 description 可参考 Table 10
  3. Table 3: 绑定信息表,名称为 rmq bindings 0 列名有 source、 vhost 、 destination 、destination_type 、 routing_key、 arguments 、 cluster_name 、 description。其中 source 、 vhost 、 destination 、 destination_type 、 routing_key 、 arguments 可以参考 3.2.3 节和 3.2.4节中的内容。 vhost 、 cluster name 和 description 可参考 Table 1。

元数据一致性检测程序可以通过 /api/definitions 的 HTTP API 接口获取集群的元数 据信息,通过解析之后与数据库中的记录一一 比对,查看是否有不一致的地方。