什么是消息队列
1.解释消息队列
# 什么是消息队列
MQ全称是Message Queue 消息队列(MQ)是一种应用程序对应用程序通信的方法,MQ是消费者-生产者模型的一个典型代表,一端往消息队列中不断的写入消息,而另一端则可以读取消息队列中的消息。这样发布者和使用者都不用知道对方的存在.
# 一种应用程序对应用程序通信的方法
进程之间的通信
"""
生产者消费者是通过一个容器来解决生产者和消费者的强耦合的问题。生产者和消费者彼此之间不能直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接丢给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取出要处理的数据,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力
"""
2.如何理解队列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fXcBksvD-1623058672384)(https://gitee.com/huangpengyang/img/raw/master/img/image-20210605142846502.png)]
3.理解python中的queue
# import queue
import queue
q = queue.Queue(maxsize=2) # maxsize 设置该队列能存放的数据个数
q.put(1111) # put 存放数据
q.put(2222)
print(q.get()) # get 取数据
print(q.get())
print(q.get()) # 取到这里就阻塞 # 原因是 block = True
"""
当设置 block = False 程序就会报错
"""
为什么要用消息队列
1.低内聚,高耦合
# 低内聚,高耦合
多个系统之间没有直接的联系,完成自己该完成的任务,通过消息队列来实现信息的传递
2.解耦,异步
# 优点
解耦
-通过消息队列,实现系统与系统之间的间接联系
异步
-生产者不用等消费者执行完毕,再返回结果,各自干各自的活
3.流量削风
# 应用场景
商城出现陡增的场景:
消息队列讲客户端发送的请求都存放在消息队列中,服务端一个个的从消息队列中获取请求,最大程度的接受用户请求,不会让服务器直接干崩。
高内聚,低耦合
# 高内聚,低耦合
多个系统之间直接联系,一个系统挂了,整个系统挂了,数据直接传递
使用 RabbitMQ
1.RabbitMQ 介绍
# 介绍
RabbitMQ 是一个由ERlang语言开发的AMQP的开源实现
rabbitMQ 是一款基于AMQP协议的消息中间件,它可以在应用之间提供可靠的消息传输。在易用性,扩展性,高可用的性能上表现优秀。使用消息中间件有利于应用之间的解耦合,生产者无需知道消费者的存在。而且俩端可以使用不同的语言编写,大大提供灵活性
2.安装 rabbitMQ
#
语法
消费者从队列获取数据的方式
# 方式
轮询分发 # 默认是轮询分发
不管性能怎么样,多个消费者按顺序获取队列里的值
公平分发
谁的性能好,谁就多从队列里获取数据
# 修改分发方式
消费者py中:
channel.basic_qos(prefetch_count=1)
简单模式
# 简单模式
生产者:
1.链接rabbitmq
2.创建队列
3.向指定的队列插入数据
消费者:
1.链接rabbitmq
2.监听模式
3.确定回调函数
# 注意
如果多个消费者同时监听一个交换器:
获取数据的方式:
轮询分发:
一个消费者只从队列中获取一个数据,以此类推下去
代码
1.生产者
2.消费者
3.参数
# 应答参数
auto_ack = True # 默认应答
"""
从队列里取数据的方式:
当程序一但遇到崩的时候,从队列里取出来的数据就不在队列里了,丢失了
"""
# 解决方式
将默认应答改成手动应答:
auto_ack = False # 默认应答改成手动应答
ch.basic_ack(delivery_tag=method.delivery_tag) # 在回调函数函数里,成功处理完数据,再发送给队列一个确认信号,再删除队列里的数据
4.持久化参数
"""
默认消息队列的数据是存在内存当中的,可以通过持久化的方式,将rabbitmq的数据存到硬盘当中
"""
# 持久化的方式
1.创建队列的时候,要么是普通的队列,要么是可持久化的队列,不可中途转换
2.在生产者中加入代码:
-创建持久化队列 :
durable=True
-向队列插入数据:
properties = pika.BasicProperties(delivery_mode=2)
# 疑惑
当发生了断电以后,持久化的数据存储在哪? 队列?
交换机模式
# 交换机模式
发布订阅模式
关键字模式
模糊匹配模式
# 注意
1.一个消费者,都要有自己的队列,该队列绑定交换机
2.多个队列同时绑定一个交换机,当消费者获取数据的时候,每个消费者都能同时获取该数据
发布订阅模式
1.步骤
# 生产者
1.链接 rabbitmq
2.创建交换机
3.往交换机存放数据
# 消费者
1.链接 rabbitmq
2.创建队列
3.队列绑定交换器
4.确定回调函数
2.生产者
3.消费者
关键字模式
1.理解图
2.生产者
3.消费者
通配符模式
1.理解图
# 本质
就相当于正则表达式一样,实现模糊匹配
"""
#号 代表一个或者多个单词,类似.*?
"""
2.生产者
3.消费者
总结
# 总结
rabbitMQ的作用:
1.解耦合
2.异步
3.流量削峰
生产者获取数据的方式:
轮询方式 # 默认
公平方式 # 看计算机性能,多劳多得
应用场景
1.发布订阅模式
多个系统都想获得的数据都是一样
2.关键字模式
不同系统设定不同的关键字,实现不同的需求
3.通配符模式
支持模糊匹配