队列---精华篇
前言
队列是基于生产者与消费者模型开展的
队列的作用
- 存储消息、数据
- 保证数据的顺序
- 保证数据的正确交付
如图:
队列用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。

多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

这里推荐使用 rabbitmq 而不是 queue ,为什么呢?
rabbitmq的介绍

如图:
rabbitmq 在 生产者与 queue 之间加了一层 exchanges (交换器),那我们先来看看整个rabbitmq 整个执行流程:
- Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
- Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
- Queue
消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
- Channel
信道,多路复用连接中的一条独立的双向数据流通道
- Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序
可以明显的从中看出Exchanges 起着过滤和推送路由的作用,试想一如果队列中有很多各种各样请求,而服务器只有那么几个,服务器不仅需要处理请求,还要花出部分时间来分析这些请求的(目的)从而分配不同的路由,虽然不至于让服务器宕机,但是也会使服务器的压力增大,用户等待的时间增长,从而导致体验感减弱。 那么有什么办法可以让服务器加快处理请求呢?
这时候exchanges(处理器)就出现了,
exchanges: 它把 Publisher 来的消息通通过滤一遍(过滤规则自定义),把不同的请求提交给不同的与它绑定关系的服务器处理,此时服务器只需要专心处理请求而不必分出心思分析请求了。
消息队列宕机
如果你的服务器宕机了,所有的消息都会丢失,咋办?
其实就是参数的配置:
- auto_ack = False
- duiable = True
- delivery_mode=2
生产者中:
#声明队列时
channel.basic_consume( queue=queue_name, on_message_callback=callback, auto_ack=False)
channel.queue_declare(queue='test', durable=True) channel.basic_publish(exchange='mydirect', routing_key='task_queue', body=message, properties=pika.BasicProperties( delivery_mode=2, # make message persistent ) )
原理: 1.auto_ack = false : 开启生产者信息确认,每次消费者提取都会与之确认一下, auto_ack = True 时,生产者只管生产,不管消费者是否接收到消息,如果没接到那就丢失。
2. durable = True : 把内存中的消息持久化到硬盘中,这样即使断电也不会数据丢失
3. delivery_mode = 2 生产者数据持久化,定义生产者时用。
exchanges的模式:
- fanout 广播
- direct 组播
- topic 规则波
大佬博客 详情:https://blog.csdn.net/wochunyang/article/details/52449559

浙公网安备 33010602011771号