rabbitmq,&队列
1.你知道什么是队列吗?
我记得上大学的时候初学数据结构,学到了栈和队列
栈:先进后出,就相当于一个有底的瓶子
队列:先进先出,就相当于一个没有底的瓶子
2.我们看一下最基本的队列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from icecream import ic
import queue
q = queue.Queue()
q.put("1")
ic(q.get())
ic(q.get())
3.我们聊一下rabbitmq基本信息:
消息队列:就是一个软件,软件里面可以创建一个队列
"""
解耦:单独拿出来
异步: 比如说,我不需要等待其他程序完成再告诉用户此单已成,我直接告诉用户,剩下的程序让他慢慢执行
流量消峰:先进入生产者队列, 然后我再慢慢消费,既不会击垮服务器
简单模式
交换模式
发布订阅
关键字模式
模糊匹配模式
4.简单模式
4.1简单模式下的生产者代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from icecream import ic
import pika
# 连接 rabbitmq
connect = pika.BlockingConnection(pika.ConnectionParameters("wusen0601.xyz"))
# 进入频道,开始操作
channel = connect.channel()
# 创建一个队列
channel.queue_declare(queue="hello")
# 向指定的队列中插入数据(简单模式="",向哪个里面插入数据,插入什么)
channel.basic_publish(exchange='',routing_key="hello",body="hello,word")
4.2简单模式下的消费者代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from icecream import ic
import pika
connect = pika.BlockingConnection(pika.ConnectionParameters("wusen0601.xyz"))
channel = connect.channel()
# 这个是为了防止消费者先运行,生产者还没有运行,就会先创建队列
channel.queue_declare(queue="hello")
def callback(ch,method,properties,body):
ic(ch)
ic(method)
ic(properties)
ic(f"[x] Received {body}")
# ch.basic_ack(delivery_tag=method.delivery_tag)
# 确定监听队列,(队列,默认应答,回调)
channel.basic_consume(queue='hello',auto_ack=True,on_message_callback=callback)
ic("[*]Waiting for message To exit press CTRL+C")
# 把消费者开始运行
channel.start_consuming()
4.3参数问题:之消费者问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
"""
怕消费者出问题
效率 高,安全低
默认应答:auto_ack=True:如果callback函数里面报错,取出来了,报错,没有打印数据,但是数据丢失了
效率低,安全高
改成手动应答:auto_ack=False,
并且在回调函数加上# ch.basic_ack(delivery_tag=method.delivery_tag),就是告诉他,我搞完了。
"""
4.4参数问题:之生产者问题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
"""
如果这个,生产者生产了数据,但是rabbitmq挂了,数据不具备持久化:
为了让数据持久化:
channel.queue_declare(queue="hello3",durable=True)
channel.basic_publish(exchange='',routing_key="hello3",body="hello,word",properties=pika.BasicProperties(delivery_mode=2))
记住:消费者也得加上durable=True
备注:队列一旦创建,就不可以改变,他是持久化就是不是就不是,不可以改变
"""
4.5参数问题:之公平分发
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 公平分发,要不就是轮询分发 在消费者里面加上这一句,就变成了公平分发 # channel.basic_qos(prefetch_count=1)
5.交换机模式
5.1发布订阅
5.2关键字
5.3通配符
6.谈一下怎么安装rabbitmq:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
sudo yum install build-essential sudo yum install libncurses5-dev sudo yum install libssl-dev sudo yum install m4 sudo yum install unixodbc unixodbc-dev sudo yum install freeglut3-dev libwxgtk2.8-dev sudo yum install xsltproc sudo yum install fop sudo yum install tk8.5 安装好之后运行: sudo yum install erlang 完成后在控制台输入命令: erl 可以查看erlang安装版本情况 2).安装RabbitMQ(可以用两种方式) 自动安装 sudo yum install rabbitmq-server 如果没有问题,那就直接安装了,不用设置什么东西 查看运行状态 service rabbitmq-server status
-----------------------------------------------------------------------------------------------------------------------------------------