RabbitMQ使用详解

1.RabbitMQ是什么?
消息队列,应用程序写和读消息队列来实现通信。

2.使用示例

1)生产者send.py发送消息到队列

import pika
# RabbitMQ用户名,密码
user_name = 'guest'
password = 'guest'

credential = pika.PlainCredentials(user_name, password)
# 建立连接
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', credentials=credential))
# 消息读写管道
channel = connection.channel()
# 创建队列
channel.queue_declare(queue='queue')
# 发送消息到队列,exchange:路由器(根据类型,路由到相应的队列),routing_key:队列名称,body:消息体
channel.basic_publish(
    exchange='',
    routing_key='queue',
    body='hello world'
)
print('send....')
# 关闭连接
connection.close()

2)消费者receive.py从队列获取消息

import pika

user_name = 'guest'
password = 'guest'

credential = pika.PlainCredentials(user_name, password)
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', credentials=credential))
channel = connection.channel()
# 队列不存在则创建,只有一个队列会创建
channel.queue_declare(queue='queue')
# 回调处理消息
def callback(ch, method, properties, body):
    print('receive.py...%r'%body)
# 从队列接收消息,callback:消息接收后回调处理函数
channel.basic_consume(
    callback,
    queue='queue',
    no_ack=True
)

print('waiting...')
# 开始监听消息队列
channel.start_consuming()

运行结果:

$ python receive.py 
receive.py: Received message 'hello world'
 [*] Waiting for messages. To exit press CTRL+C

3.RabbitMQ基本概念
1)收发消息过程

Broker:消息队列服务器实体
消息:就是一个简单的字符串,每个消息都有一个路由键(routing key)属性
connection:应用程序和broker的网络连接
channel:进行消息读写的管道
exchange:交换机,接收消息,根据路由键转发消息到绑定的队列
绑定:交换机(路由表)和队列绑定起来
队列:消息的容器,一个消息可投入一个或多个队列,消费者从队列取走消息
2)exchange
接收消息,根据路由键转发消息到绑定的队列
exchange有四种类型:direct,topic,headers,fanout
每种规则匹配队列时,CPU的开销是不同的,可以根据不同需求,选择不同类型的交换机。
Direct交换机:完全匹配,单播
routing key和对列名完全匹配

Topic交换机:正则匹配,组播
根据binding-key匹配符合的routing-key,
匹配规则:有两种通配符"#"和"",#表示0或多个单词,表示一个单词
如:binging-key:*.sock.#匹配routing-key: usd.stock和eur.stock.db,但是不匹配stock.ma

Fanout交换机:消息转发所有绑定对列,最快,广播
fanout不处理路由键,简单将对列绑定到交换机,消息将转发到所有绑定的队列
3)注意事项
没有队列绑定到交换机,则发送到该交换机的消息会丢失
一个交换机可以绑定多个队列,一个队列可以被多个交换机绑定
不能更改交换机类型

4.RabbmitMQ属性
1)持久性
如果启用,队列再Server重启前都有效
2)自动删除
如果启用,那么队列将在所有的消费者停止使用之后自动删除自身
3)惰性
如果没有声明队列,那么在执行到使用的时候回导致异常,并不会主动声明
4)排他性
如果启用,队列只能被声明它的消费者使用

5.RabbitMQ持久化
1)客户端丢失
RabbitMQ分发完消息后,就会从内存中把消息删除掉。如果客户端连接断开了,那么客户端正在处理的消息和等待处理的消息,都将丢失。
因此,RabbitMQ引入了消息确认机制

no_ack=False

将receive.py中channel.basic_consume消息接收事件中,no_ack属性设为False,客户端消息处理完毕后会发送确认给RabbitMQ服务器。
需要注意的是,一定要确保在任何情况下,都会发送确认给RabbitMQ,否则将引起内存泄漏。
2)RabbitMQ服务端丢失
RabbitMQ重启后,消息将丢失。不过,RabbitMQ提供了持久化机制,可以将消息持久化到磁盘。

channel.queue_declare(queue='queue', durable=True)

6.常用命令
1)启动

rabbitmq-server &

2)队列重置

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmq stop

3)关闭

rabbitmqctl stop

4)列举所有用户

rabbitmqctl list_users

5)列举所有队列

rabbitmqctl list_queues

6)添加用户

rabbitmqctl add_user user_name user_passwd

7)设置用户角色为管理员

rabbitmqctl set_user_tags user administrator

8)权限设置

rabbitmqctl set_permissions -p / user ".*" ".*" ".*"

9)查看状态

rabbitmqctl status

10)安装web管理插件

rabbitmq-plugins enable rabbitmq_management

可以通过http://localhost:15672查看服务器状态

posted on 2017-10-03 09:21  迪米特  阅读(443)  评论(0编辑  收藏  举报

导航