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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!