Python操作RabbitMq

一:介绍

简介

RabbitMq本质就是一个消息中间人(broker),它接受并且发送消息,可以将其比喻成一个邮局,当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, RabbitMQ 就是一个邮筒, 同时也是邮局和邮递员 

在上述比喻中不同点在于RabbitMq不处理纸质信件,而是接收(accept),存储(storage),转发(forwards)二进制数据消息(messages)

术语

Broker:消息队列服务器实体,接收和分发消息的应用

Exchange:消息交换机,其指定消息按什么规则 路由到那个队列里

Queue:消息队列载体,每个消息可以投放到一个或多个队列中

Binding:绑定 将exchange交换机与Queue队列绑定在一起

Routing Key:路由关键字,消息发送给exchange交换机的时候 会有一个路由键(默认为空),交换机根据这个路由键进行消息的分发到哪个队列之中

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

producing:在这里的意思就是发送(sending). 一个发送消息的程序就是生产者( producer)

consuming :与接收(receiving)有相似的含义. 消费者(consumer)就是等待接收消息的程序

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

 要注意的是 生产者, 消费者, 和中间人不必在相同的主机上,实际上大多数情况下它们都不在同一台主机上

消息队列机制

客户端打开一个消息队列服务器,声明一个channel

客户端声明一个exchange并且设置相关属性

客户端声明一个Queue并且设置相关属性

客户端使用Routing Key设置exchange与queue之间的绑定关系

exchange接收到消息后,就根据消息的key和已经设置的binding,将消息投递到一个或多个队列里。

exchange类型

Direct交换机

特点:根据key进行投递

例如:Routing key为hello 那么当客户端发送消息的时候只有设置了key为hello的消息才可以投递到队列

Topic交换机

特点:对key进行匹配后进行投递 '#'匹配一个或多个词,'*'匹配一个词

例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。

Fanout交换机

特点:不需要key,采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列

二:生产者消费者模型

对于RabbitMQ来说,生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMq Server实现的消息队列。

生产者(producter):用来产生数据 并将数据发送到队列中

import pika  # 引入mq包
import time

credentials = pika.PlainCredentials('SR', '123456')  # 如果需要远程连接mq服务需要传入用户名密码进行验证

connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672))  # 创建mq的连接

channel = connection.channel()  # 创建一个中间件人broker

res = channel.queue_declare(queue='SR')  # 创建一个队列 队列名称SR
print(res)  # <METHOD(['channel_number=1', 'frame_type=1', "method=<Queue.DeclareOk(['consumer_count=0', 'message_count=0', 'queue=SR'])>"])>

for i in range(5):
    message = 'hello world%s' % i
    # 向队列插入数值 routing_key是队列名
    # body传入的数据
    channel.basic_publish(exchange='', routing_key='SR', body=message)

connection.close()  # 关闭链接通道

消费者(consumer):队列消息的接收者,负责 接收并处理 消息队列中的消息

import pika
import time

credentials = pika.PlainCredentials('SR', '123456')  # 如果需要远程连接mq服务需要传入用户名密码进行验证

connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', port=5672))  # 创建mq的连接

channel = connection.channel()  # 声明一个频道

res = channel.queue_declare(queue='SR')  # 创建一个队列 队列名称SR 防止生产者没有队列 消费者不知道从哪个队列取数据


def callback(ch, method, properties, body):
    print(ch)  # <BlockingChannel impl=<Channel number=1 OPEN conn=<SelectConnection OPEN transport=<pika.adapters.utils.io_services_utils._AsyncPlaintextTransport object at 0x000000000C6CDDD8>
    print(method)  # <Basic.Deliver(['consumer_tag=ctag1.d109b32cf17d46ca92c3d3a96d280df7', 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=SR'])>
    print(properties)  # <BasicProperties>
    print(body)  # b'hello world0' 二进制数据


# 告诉rabbitmq,用callback来接收消息
channel.basic_consume(
    queue='SR',  # 指定队列名
    on_message_callback=callback  # 从队列里获取消息
)

# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理
channel.start_consuming()
posted @ 2020-03-26 11:36  SR丶  阅读(425)  评论(0编辑  收藏  举报