rabbitmq测试方法
1. 背景:mq选型切换
1.1 activemq使用现状
当前的集成框架中,选择使用ActiveMQ(通知服务)作为消息交换中间件。同时在基础组件中提供了ActiveMQ组件作为基础的MQ选型。即:
(1) 通知服务;(2)组件依赖类型:消息队列依赖(queue)
1.2 activemq使用中的不足
随着使用消息中间件的客户端增多,ActiveMQ单节点的性能逐渐乏力,问题:1)实施高可用、高可靠复杂度大;2)吞吐量等性能成为瓶颈,且扩容方案较重;3) 只能通过身份认证控制权限,而需求上将会需要更细粒度的topic级别的权限控制。即:产品层面难以满足高可用要求;业务层面难以满足性能要求;安全层面权限控制不足。
2.测试方法
2.1 rabbitmq状态验证
Ø mq状态查看
[root@HikvisionOS ~]# cd /opt/hikvision/web/components/rabbitmq.1/bin/rabbitmq/sbin/
[root@HikvisionOS sbin]# ./rabbitmqctl status
Ø mq停止
[root@HikvisionOS sbin]# ./rabbitmqctl stop
Ø 配置文件
/web/components/rabbitmq.1/bin/rabbitmq/etc/rabbitmq/rabbitmq-env.conf
Ø 数据文件
/web/components/rabbitmq.1/data/mnesia
Ø 证书
/web/components/rabbitmq.1/data/ssl_certificate
2.2 插件
Step1:开启插件
Ø mq插件列出
[root@HikvisionOS sbin]# ./rabbitmq-plugins list
Ø 插件安装(消息追踪插件)
[root@HikvisionOS sbin]# ./rabbitmq-plugins enable rabbitmq_tracing
Ø 插件卸载
[root@HikvisionOS sbin]# ./rabbitmq-plugins disable rabbitmq_tracing
Ø 消息追踪关闭
[root@HikvisionOS sbin]# ./rabbitmq-plugins disable rabbitmq_tracing
Step3:查看消息内容
消息将保存在添加的文件中,该文件可在上一步骤中的rabbitmq的web页面直接点击打开,或存储于服务器/var/tmp/rabbitmq-tracing路径下
Step4:消息解析
部分消息内容需要经过Base64 解码
2.3 自动化实现(python)
通过AMQP协议的Python客户端开发包:pika库,可以完成通过rabbitmq进行消息收发的任务及测试。
def message_send(topic, num, lasttime):
# 获取运管配置文件中的notify配置信息
mq_conf = conf().rbbitmq_conf()
# 添加用户名和密码
credentials = pika.PlainCredentials(mq_conf[0], mq_conf[1])
# 配置连接参数
connection = pika.BlockingConnection(
pika.ConnectionParameters(host=mq_conf[2], port=int(mq_conf[3]),
virtual_host='/', credentials=credentials))
# 创建频道
channel = connection.channel()
# 声明交换机
result = channel.exchange_declare(exchange='credentials', exchange_type='fanout')
print(result)
t = time()
t_current = time()
while t_current - t < lasttime:
for i in range(num):
message = json.dumps({'OrderId': "1000%s,%s" % (lasttime, i)})
# 投递消息routing_key是队列名
channel.basic_publish(exchange=topic, routing_key='python-test', body=message)
print(message)
t_current = time() # current time
# 关闭TCP连接
connection.close()
def message_receive(topic):
# 获取运管配置文件中的notify配置信息
mq_conf = conf().rbbitmq_conf()
# 添加用户名和密码
credentials = pika.PlainCredentials(mq_conf[0], mq_conf[1])
# 配置连接参数
connection = pika.BlockingConnection(
pika.ConnectionParameters(host=mq_conf[2], port=int(mq_conf[3]),
virtual_host='/', credentials=credentials))
# 创建频道
channel = connection.channel()
channel.exchange_declare(exchange=topic, exchange_type='fanout',
durable=True)
# 这里不指定queue
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue
# 队列和交换机绑定
channel.queue_bind(exchange=topic, queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(result)
print(" [x] %r" % body)
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
# 循环等待
channel.start_consuming()
3.典型问题分享
3.1 异常场景
(1)磁盘空间不足,扩容后rabbitmq启动成功
(2)修改服务器hostname并重启生效,rabbitmq启动成功