zoukankan      html  css  js  c++  java
  • 消息队列

    一、什么是消息队列
    消息(Message)俩个对象(应用)之间通信传递的数据,这些数据可以只包含一些字符串,也可以更复杂,可能包含嵌入对象。

    队列(Queue)就是让上面传递的数据排成一队,使传递的数据有先后顺序。
    消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,有消息系统来确保信息的可靠专递,消息发布者只管把消息发布到MQ中而不管谁来取,消息使用者只管从MQ中取消息而不管谁发布的,这样发布者和使用者都不用知道对方的存在。
    二、为何使用消息队列

    有一个场景,每年快到春节时,火车站通常会有很多人排着长长的对区买票,也就是说在那个时刻,假设会有10000人需要买到票,但由于火车站只开放了10个售票窗口,没有10000个售票窗口进行售票,所以为了不被人群挤爆,它们就让人群在每个窗口排了一对人,分别处理买票事件,这里就应用了消息队列的模式。

    说了这么多,我们把上面这个场景切换到我们程序中来,假设我们有一个售票网站(火车站),同一时间有10000人进行了购票操作,如果我们不进行一些处理的话,数据库服务器可能承受不了这么大的压力,就会出现数据错乱,或者直接挂掉等等情况,那这种大流量的情况下在程序中我们这么办呢?用MQ,异步处理这些请求(把消息推到MQ中),慢慢对数据库进行操作,减轻其压力,这里MQ的功能主要是处理高并发的流量-异步方式。 

    当然,不清楚的话这里还可以举个例子,比如常见的订单系统,用户点击【下单】按钮后的业务逻辑包括:扣减库存、生成相应的单据、发红包、发短信通知‘在业务发展初期这些逻辑可能放在一起同步执行,随着业务订单量增长,需要提升系统服务的性能,这时候可以将一些不需要立即生效的操作拆分出来异步执行,,比如发红包、发短信通知等。这种场景就可以用MQ,在下单的主流程(比如扣减库存、生成相应的单据)完成之后发送一条消息到MQ让主流程快速完结,而由另外的单独线程拉取MQ的消息(或者由MQ推送消息),当发现MQ中有发红包或者发短信之类的消息,执行相应的业务逻辑。
    这里MQ是用于业务解耦的情况,其他常见场景包括最终一致性、广播、错峰流控等等。

     总结一下,我们为什么要使用MQ,解耦、异步、削峰

    三、消息队列的应用及优缺点

    先来说说缺点吧

    系统可用性降低:你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统会受到影响。因此,系统可用性降低

    系统复杂性增加:使用消息队列要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。

    但是,我们该用还是要用的。

    应用

    (1)服务员点菜快,厨师做菜慢,服务员只需要下单给厨师,然后就可以继续去服务顾客,不需要等待厨师把菜做完

    点菜单就相当于消息,放单子的位置就相当于队列

    (2)业务系统需要发短信,但短信发送模块速度跟不上,业务系统就可以把发送短信的相关信息封装为一个消息,放入队列,短信发送模块从队列中获取消息进行处理

    (3)不同应用系统间通信。

    消息队列的优点 (解耦、异步、削峰--并发)
    (1)提高系统响应速度
    使用消息队列,生产者一方,把消息往消息队列里一扔,就可以立马返回响应用户,无需等待处理结果
    (2)保证消息的传递
    如果发送消息时接收者不可用,消息队列会保留消息,直到成功的传递它
    (3)解耦
    只要信息格式不变,即使接收者的接口、位置、或者配置改变,也不会给发送者带来任何改变
    消息发送者无需知道消息接收者是谁,使得系统设计更清晰
    为什么需要分布式消息队列
    (1)多系统协作需要分布式
    例如消息队列的数据需要在多个系统之间共享,所以需要提供分布式通信机制、协同机制
    (2)可靠
    消息会被持久化到分布式存储中,这样避免了单台机器存储的消息由于机器问题导致消息丢失
    (3)可扩展
    分布式消息队列,会随着访问量的增加而方便的增加处理服务器


    四 简单介绍一种消息队列中间件---RabbitMQ的组成 (不一定会说,这里用图表示最后,还没画好)

    1、Message 
    消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。 
    2、Publisher 
    消息的生产者,也是一个向交换器发布消息的客户端应用程序。 
    3、Exchange 
    交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。 
    4、Binding 
    绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。 
    5、Queue 
    消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。 
    6、Connection 
    网络连接,比如一个TCP连接。 
    7、Channel 
    信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。 
    8、Consumer 
    消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。 
    9、Virtual Host 
    虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。 
    10、Broker 
    表示消息队列服务器实体。

  • 相关阅读:
    [网站运营]浅谈如何尽可能的避免cms网站被黑
    [CDN]阿里云(企业云解析DNS)让你的博客飞起来
    阿里新生的面试经,与老人分享的职业进阶攻略及规划
    高逼格!程序猿的表白也可以这么浪漫
    程序员表白专属技能,你还不快学起来
    序列上的一些文章
    序列上的一些文章
    最长不下降子序列
    最长不下降子序列
    luoguP2831 愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/wh-alan/p/10160412.html
Copyright © 2011-2022 走看看