RabbitMQ 问题汇总(长期更新)

1、RabbitMQ的监控、qps、队列消费情况,是怎么监控的?

开启RabbitMQ WEB管理后台,通过API功能进行相关数值查询,可参考脚本(已在实际生产环境中测试过)


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import json
import urllib2
import sys

class rabbitMp_api():
    '''
    初始化变量
    '''
    def __init__(self,host = '127.0.0.1',port = '15672',user = 'guest',protocol='http'):
        self.host = host
        self.port = port
        self.user = user
        self.protocol = protocol
    '''
    获取api信息
    '''
    def post_api(self,path):
        url = '{0}://{1}:{2}/api/{3}'.format(self.protocol, self.host, self.port,path)
        password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
        password_mgr.add_password(None, url, self.user, self.user)
        handler = urllib2.HTTPBasicAuthHandler(password_mgr)
        return json.loads(urllib2.build_opener(handler).open(url).read())
    def list_queues(self):
        queues = []
        quedict = {}
        for queue in self.post_api('queues'):
            queues.append({"{#VHOST_NAME}":queue['vhost']+queue['name']})
        quedict["data"] = queues
        return json.dumps(quedict)
    def check_overview(self,item = sys.argv[1]):
        if item in [ 'connections', 'consumers', 'queues']:
            return int(self.post_api('overview').get('object_totals').get(item, 0))
        if item in ['publish']:
            return int(self.post_api('overview').get('message_stats').get(item,0))

a = rabbitMp_api()
if __name__ == "__main__":
        try:
                item = sys.argv[1]
        except:
                print(sys.argv[0]+" "+ "publish|consumers|queues|connections")
        else:
                if item == "publish" :
                        print a.check_overview('publish')
                elif item  == "consumers":
                        print a.check_overview('consumers')
                elif item  == "queues":
                        print a.check_overview('queues')
                elif item  == "connections":
                        print a.check_overview('connections')
                elif item  == "discover":
                        print a.list_queues()

2、RabbitMQ有5台机器,最多能忍受多少台主机宕机?

(1)集群角色中必须保证一台磁盘节点的存在,供数据恢复使用

(2)具体集群中可存在多少主机需按实际业务使用量来定义,刨除业务使用来讲只要存在磁盘节点即可

3、RabbitMQ如果挂了其中一个机器,应用如何切换到其余4个好的节点?

rabbitmq集群中存在HA的角色(高可用),所以会自动切换到可用的节点上

4、消费者访问RabbitMQ,是随机访问其中一个节点吗,还是固定访问一个主节点?

对于不同的消费者而言,是随机选择的RabbitMQ去连接的,RabbitMQ集群内部数据会同步