消息队列

一、消息队列

  “消息队列”是在消息的传输过程当中保存消息的容器。消息队列,通常咱们会简称它为MQ(Message Queue)python

咱们先无论消息(Message)这个词,来看看队列(Queue)web

队列是一种先进先出的数据结构。python用list 实现队列。数据库

class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        if self.isEmpty():
            return None
        return self.items.pop()

    def size(self):
        return len(self.items)

  在Python里边,已经实现了很多的队列了,好比 queue模块中的 Queue,Collections中的deque:服务器

 

2、为何要用消息队列?网络

为何要用消息队列,也就是在问:用了消息队列有什么好处。数据结构

  1.经过异步处理提升系统性能(削峰、减小响应所需时间);架构

  2.下降系统耦合性。并发

 

(1) 经过异步处理提升系统性能(削峰、减小响应所需时间)异步

  • 在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的状况下数据库压力剧增,使得响应速度变慢。
  • 可是在使用消息队列以后,用户的请求数据发送给消息队列以后当即 返回,
  • 再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。
  • 因为消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),所以响应速度获得大幅改善。

经过以上分析咱们能够得出消息队列具备很好的削峰做用的功能——即经过异步处理,将短期高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。分布式

举例:在 各类稀缺资源(火车票,打折商品)的抢购 中,合理使用消息队列能够有效抵御促销活动刚开始大量订单涌入对系统的冲击。

(2) 下降系统耦合性

 若是模块之间不存在直接调用,那么新增模块或者修改模块就对其余模块影响较小,这样系统的可扩展性无疑更好一些。

  • 刚开始只有一台服务器,订单系统 和 配送系统 共用一个数据库 (用户少,数据量不大)
  • 两台服务器,订单系统通知配送系统,等待响应回复,延迟较大(用户稍多,数据量稍微增大)
    • 性能稍有提高,典型的同步操做
  • 使用消息队列,在大型分布式系统中,同步 变 异步通讯

               

  •  刚开始,订单系统 经过 普通方法调用 就能够 通知 配送系统,
  • 分开之后只能经过网络,调用  web的服务 来 通知 配送系统。
  • 最后 经过 消息队列 异步通讯。

 

咱们最多见的事件驱动架构相似生产者消费者模式,在大型网站中一般用利用消息队列实现事件驱动结构。

  1. 把数据到消息队列叫作生产者(Message Producer)
  2. 从消息队列里边数据叫作消费者(Message Consumer)

 

  • 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合
  • 消息发送者将消息发送至分布式消息队列即结束对消息的处理,
  • 消息接受者从分布式消息队列获取该消息后进行后续处理,并不须要知道该消息从何而来。
  • 对新增业务,只要对该类消息感兴趣,便可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计

另外为了不消息队列服务器宕机形成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。

在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其余服务器发布消息。