队列---精华篇

前言

队列是基于生产者与消费者模型开展的

队列的作用

  • 存储消息、数据
  • 保证数据的顺序
  • 保证数据的正确交付

如图:

队列用于存储消息。生产者(下图中的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

posted @ 2019-04-03 16:36  萤huo虫  阅读(112)  评论(0)    收藏  举报