一、简单模式
1.安装pika模块
pip install pika
2.启动rabbitMQ 服务
3.简易模式
生产者
1.链接rabbitmq
2.创建队列
3.向指定队列插入数据
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 创建队列
channel.queue_declare(queue='hello')
#3 向指定队列插入数据
channel.basic_publish(exchange='',# 简单模式
routing_key='hello',#指定队列
body='Hello World!')
消费者
1.链接rabbitmq
2.创建队列 如果已经有这个队列就不执行 如果生产者没有这个队列就创建一个队列
3.定义回调函数
4.监听配置 有数据后执行回调
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 创建队列 如果已经有这个队列就不执行 如果生产者没有这个队列就创建一个队列
channel.queue_declare(queue='hello')
#定义回调函数
def callback(ch,method,properties,body):
# 具体操作....
# 监听配置 有数据后执行回调
channel.basic_consume(queue='hello',
auto_ack=True,# 默认应答模式
on_message_callback=callback)# 回调函数
# 启动监听
channel.start_consuming()
3.参数
应答模式
auto_ack 参数:主要处理数据丢失 例消费者在回调函数中报错 由于数据已经取出 队列里无数据 造成数据丢失 此时可以采用手动应答 默认追求效率 手动注重安全
auto_ack=True 开启 默认 应答模式 代码如上 追求效率
auto_ack=False 开启 手动 应答模式 手动应答模式需在 回调函数最后加入ch.basic_ack(delivery_tag=method.delivery_tag) 用于确保回调执行成功后 清除数据
消费者
import pika
# ....
#定义回调函数
def callback(ch,method,properties,body):
# 具体操作....成功后最后加入下面的话
ch.basic_ack(delivery_tag=method.delivery_tag)
# 监听配置 有数据后执行回调
channel.basic_consume(queue='hello',
auto_ack=Flase,# 默认应答模式
on_message_callback=callback)# 回调函数
数据持久化
生产者
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 创建队列
channel.queue_declare(queue='hello',durable=True) #durable为True 为持久化
#3 向指定队列插入数据
channel.basic_publish(exchange='',
routing_key='hello',#需与queue一致
body='Hello World!',
properties=pika.BasicProperties(delivery_mode=2)#2指明message为持久的
)
delivery_mode 投递消息模式
1 . ram
2 . disc
分发参数
谁先快谁先获取,不是一个分发后阻塞等待
消费者
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 创建队列 如果已经有这个队列就不执行 如果生产者没有这个队列就创建一个队列
channel.queue_declare(queue='hello')
#3 定义回调函数
def callback(ch,method,properties,body):
# 具体操作....成功后最后加入下面的话
ch.basic_ack(delivery_tag=method.delivery_tag)
#4 公平分发 谁快谁先获取
channel.basic_qos(prefetch_count=1)
#5 监听配置 有数据后执行回调
channel.basic_consume(queue='hello',
auto_ack=Flase,# 默认应答模式
on_message_callback=callback)# 回调函数
4.交换机模式
发布订阅模式
由生产者 声明交换机 ,消费者声明队列 用队列绑定交换机 相当于 交换机是发布者 队列是订阅者
生产者
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 声明交换机 exchange交换机名字 exchange_type模式固定
channel.exchange_declare(exchange="logs",exchange_type="fanout")
#3 向指定队列插入数据
channel.basic_publish(exchange='logs',# 向指定的交换机插入数据
routing_key='',
body='Hello World!')
connection.close()
exchange_declare参数
exchange:交换机名字 可以任意
exchange_type:fanout为发布订阅模式 固定
basic_publish参数
exchange 向指定交换机插入数据 参数为交换机名字
消费者
1.链接rabbitmq
2.声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机
3.创建队列 第一个参数为空字符 exclusive为True 系统随机名字
4.将创建的队列绑定到交换机 queue为队列名字
5.定义回调函数
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机
channel.exchange_declare(exchange="logs",exchange_type="fanout")
#3 创建队列 第一个参数为空字符 exclusive为True 系统随机名字
result=channel.queue_declare("",exclusive=True)
# 获取队列名字
queue_name=result.method.queue
#4 将创建的队列绑定到交换机 queue为队列名字
channel.queue_bind(exchange="logs",queue=queue_name)
#5 定义回调函数
def callback(ch,method,properties,body):
# 具体操作....
# 监听配置 有数据后执行回调
channel.basic_consume(queue=queue_name,
auto_ack=True,# 默认应答模式
on_message_callback=callback)# 回调函数
# 启动监听
channel.start_consuming()
创建队列后 绑定交换机
注意:队列名字为 唯一值 所以建议使用queue_declare("",exclusive=True) 创建唯一值
关键字模式
和发布订阅模式相比,消费者的队列绑定 交换机时需要加入关键字 当发布消息 只有绑定响应的关键字的 队列才能收到消息
生产者
1.链接rabbitmq
2.声明交换机 exchange交换机名字必须和消费者保持一致 exchange_type模式固定
3.向指定队列插入数据 routing_key为关键字名字
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 声明交换机 exchange交换机名字必须和消费者保持一致 exchange_type模式固定
channel.exchange_declare(exchange="logs",exchange_type="direct")
#3 向指定队列插入数据 routing_key为关键字名字
channel.basic_publish(exchange='logs',# 向指定的交换机插入数据
routing_key='info',
body='Hello World!')
connection.close()
消费者
1.链接rabbitmq
2.声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机 !!! 交换机名字必须和消费者保持一致
3.创建队列 第一个参数为空字符 exclusive为True 系统随机名字
4.将创建的队列绑定到交换机 queue为队列名字,获取关键字为info 的信息
5.定义回调函数
import pika
#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
#2 声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机
#!!! 交换机名字必须和消费者保持一致
channel.exchange_declare(exchange="logs",exchange_type="fanout")
#3 创建队列 第一个参数为空字符 exclusive为True 系统随机名字
result=channel.queue_declare("",exclusive=True)
# 获取队列名字
queue_name=result.method.queue
#4 将创建的队列绑定到交换机 queue为队列名字,获取关键字为info 的信息
channel.queue_bind(exchange="logs",queue=queue_name,routing_key="info")
#如果需要绑定多个 需要声明多个
#channel.queue_bind(exchange="logs",queue=queue_name,routing_key="warning")
#5 定义回调函数
def callback(ch,method,properties,body):
# 具体操作....
# 监听配置 有数据后执行回调
channel.basic_consume(queue=queue_name,
auto_ack=True,# 默认应答模式
on_message_callback=callback)# 回调函数
# 启动监听
channel.start_consuming()
一次性只能绑定一个关键字