SpringBoot学习之路---短博客搞懂消息队列是个啥(仅入门)

大家在学习过程可能经常会看到"消息队列"、“RabbitMQ”、"Kafka"等等这些词。反正我关注的挺多公众号会推送这些的相关文章,但是还没有到那种应用场景,所以就没有去额外关注。最近刚刚好学习了一些有关消息队列的知识,就来记录一下


消息队列是个啥

消息队列其实是一个消息的容器。它的底层是一个队列(Queue)的数据结构,它满足先进先出的原则。也就是说先进来的消息先出去,后进来后出去。这样消息被消费时,大致有个顺序可言。

基于消息队列的架构大致是这样的,浏览器发出某个请求,由生产者生成消息,并进入到消息队列中,等待消息接受者来接受并处理。在等待的过程中,先把结果先返回给浏览器(比如注册账户时,先把消息放入消息队列中,然后把"注册成功"的消息返回给浏览器),而不是先处理它。在消息接受者接受消息后,编写相应的程序去处理它,最后如果有需要再把这个处理结果放到消息队列,等待别的消息接受者进行二次处理。

在这里插入图片描述

消息队列的各个概念解释

消息发送者(publisher):也叫做消息生产者,是消息发送的源头

消息接受者(consumer):接受消息并进行处理的程序,也叫做消息的消费者,它们在处理完消息

消息代理(message broker):当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地

目的地(destination):顾名思义,消息要发送到的地方,而目的地又大致分为两种方式,点对点式(point to point)主题式(topic)

  • 点对点式
    消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
    消息只有唯一的发送者和接受者,但并不是说只能有一个接收者

  • 主题式:
    这种方式也称为发布订阅式
    发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息

消息的协议规范:现在市面大致有两种有关消息的规范,JMSAMQP,这两个就相当于jdbc对操作数据库而言。

  • JMS:JAVA消息服务,基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
  • AMQP(Advanced Message Queuing Protocol)
    高级消息队列协议,也是一个消息代理的规范,兼容JMS
    RabbitMQ是AMQP的实现

两者的区别:
在这里插入图片描述

RabbitMQ简介与概念

RabbitMQ简介:
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。它是AMQP协议的实现类

一些概念

  • Message
    消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。其中routing-key(路邮键)挺重要的,决定了进入哪一个消息队列。

  • Exchange
    交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
    Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别,第一种类型就是之前提到的点对点式,后面三种是主题式的细分。

  • Queue
    消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

  • Binding
    绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
    Exchange 和Queue的绑定可以是多对多的关系。一个Exchange可以绑定多个Queue,同理Queue也是一样

  • Connection
    网络连接,比如一个TCP连接。

  • Channel
    信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
    简单来说,信道所有的消息传输都是用同一个连接来传输数据,而不同的消息传输则是在连接中走不同的"路"。

  • Virtual Host
    虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

  • Broker
    表示消息队列服务器实体

它们之间的关系为:
在这里插入图片描述

消息队列的应用场景:

它的应用场景主要就是流量削峰应用解藕

首先来谈谈流量削峰,在上文讲解消息队列时就说过它的架构模式,消息代理在接受到消息,先给浏览器返回处理结果信息。这么做有一个好处,就是让用户看到的响应速度变快了。用一个比喻讲就是,有一个人来请求我办事,我思考了一下可不可以帮,发现可以之后先答应你,之后在慢慢做。平时在一些高并发的场景下,短时间会有大量的访问量,而使用传统的架构模式容易导致宕机,使用基于消息队列的架构模式,先接受消息请求,响应完成后在处理,消息的读取速度远远快于数据库的读取速度,这样就起到了流量削峰的目的。同时它还支持多个消息队列,这样还可以多队列消息访问,速度会更快。

应用解藕

消息队列使利用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。这样也就达成了应用解藕的目的。


记得有一点点杂乱,如果有一些错误,欢迎各位指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章