消息队列

Posted 51try-again

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列相关的知识,希望对你有一定的参考价值。

1、消息队列

  “消息队列”是在消息的传输过程中保存消息的容器。消息队列,一般我们会简称它为MQ(Message Queue)

我们先不管消息(Message)这个词,来看看队列(Queue)

队列是一种先进先出的数据结构。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:

技术图片

技术图片

 

二、为什么要用消息队列?

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

  1.通过异步处理提高系统性能(削峰、减少响应所需时间);

  2.降低系统耦合性。

 

(1) 通过异步处理提高系统性能(削峰、减少响应所需时间)

技术图片

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

通过以上分析我们可以得出消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

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

(2) 降低系统耦合性

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

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

技术图片               技术图片

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

技术图片

 

我们最常见的事件驱动架构类似生产者消费者模式,在大型网站中通常用利用消息队列实现事件驱动结构。

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

 

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

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

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

以上是关于消息队列的主要内容,如果未能解决你的问题,请参考以下文章

消息队列属性及常见消息队列介绍

RabbitMQ 消息队列

Linux进程间通信 --- 消息队列

Redis(五)-特性-消息队列

redis消息队列有没有

到底啥是消息队列?Java中如何实现消息队列