关于python运用RabbitMQ

一、简单模式

1.安装pika模块

pip install pika

2.启动rabbitMQ 服务

3.简易模式

生产者

1.链接rabbitmq

2.创建队列

3.向指定队列插入数据

ini 复制代码
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.监听配置 有数据后执行回调

ini 复制代码
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) 用于确保回调执行成功后 清除数据

消费者

ini 复制代码
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)# 回调函数

数据持久化

生产者

ini 复制代码
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

分发参数

谁先快谁先获取,不是一个分发后阻塞等待

消费者

ini 复制代码
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.交换机模式

发布订阅模式

由生产者 声明交换机 ,消费者声明队列 用队列绑定交换机 相当于 交换机是发布者 队列是订阅者

生产者
ini 复制代码
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.定义回调函数

ini 复制代码
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为关键字名字

ini 复制代码
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.定义回调函数

ini 复制代码
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()

一次性只能绑定一个关键字

通配符模式

相关推荐
程序员-珍14 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin3344556631 分钟前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
bug菌1 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
夜月行者3 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
Yvemil73 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance3 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
猿java4 小时前
使用 Kafka面临的挑战
java·后端·kafka
碳苯4 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
kylinxjd4 小时前
spring boot发送邮件
java·spring boot·后端·发送email邮件
2401_857439697 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux