赞
踩
RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。
RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。
~
本篇内容包括:RabbitMQ 简介、RabbitMQ 相关概念
RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。
RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。
Erlang 是一门通用编程语言,主要用途是构建并发应用程序,在 1991 年由爱立信公司向用户推出了第一个版本。目的是创造一种可以应付大规模并发活动的程序设计语言和运行环境。现在 Erlang 主要用于电信行业、Web 应用、分布式计算、即时消息、电子商务等领域,负责处理大规模的并发持续连接。
AMQP(Advanced Message Queuing Protocol)高级消息队列协议,一个提供统一消息服务的应用层标准协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP是一个进程间传递异步消息的网络协议。
基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。
Ps:我们对 RabbitMQ 的学习和掌握在很大程度上就是对 AMQP 的学习和掌握!
消息队列 是在消息的传输过程中保存消息的容器。
消息队列 是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。
消息队列的作用:
简单来说 Broker 就是消息队列服务器实体。
我们把部署 RabbitMQ 的机器称为节点,也就是 Broker。Broker 有 2 种类型节点:
Exchange 的可以说是“人如其名”,在 RabbitMQ 的消息传递模型中,对于 Exchange 的核心思想就是:生产者生产的消息从不会直接发送到队列,生产者只能将消息发送到交换机。交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。
Exchanges 的类型:直接(direct)、主题(topic)、标题(headers)、扇出(fanout)
Queue 即消息队列载体,是 RabbitMQ 的内部对象,用于存储消息队列,并将它们转发给消费者,每个消息都会被投入到一个或多个队列(Queue)
Binding 绑定,RabbitMQ 中通过 Binding 将 Exchange 与 Queue 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列了。
如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmOW94Tk-1670682296011)(https://lizhengi.oss-cn-beijing.aliyuncs.com/BenjaminNode/Binding%20(1)].png)
一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange 和 Queue 的绑定可以是多对多的关系。
Routing Key 路由关键字,exchange 根据这个关键字进行消息投递
Exchange 接收到的消息会带有 RoutingKey 这个字段,Exchange 就是根据这个 RoutingKey 和当前 Exchange 所有绑定的 BindingKey 做匹配,如果满足要求,就往 BindingKey 所绑定的 Queue 发送消息,这样我们就解决了我们向 RabbitMQ 发送一次消息,可以分发到不同的 Queue 的过程
Ps:由 Exchange、Queue、RoutingKey 三个才能决定一个从 Exchange 到 Queue的 唯一的线路。
VHost 可以理解为虚拟 Broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 VHost 范围的用户控制。当然,从 RabbitMQ 的全局角度,VHost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 VHost 中)。
Producer 消息的生产者,也就是发送消息的一方,消息一般包含两个部分:消息体(payload)和标签(Label)
Consumer 消息的消费者,也就是接受消息一方,连接上 RabbitMQ 服务器,并订阅到队列上。消费消息只消费消息体,丢弃标签。
Channel 信道是生产者/消费者与 RabbitMQ 通信的渠道,生产者 publish 或者消费者消费一个队列都是需要通过信道来通信的。信道是建立在 TCP 上面的虚拟链接,也就是 RabbitMQ 在一个 TCP 上面建立成百上千的信道来达到多个线程处理。
在客户端的每个连接里,可建立多个 Channel,每个 Channel 代表一个会话任务
Ps:一个TCP 被多个线程共享,每个线程对应一个信道,信道在 RabbitMQ 都有唯一的 ID,保证了信道的私有性,对应上唯一的线程使用。
Ps:RabbitMQ 需要使用信道,而不是直接进行 TCP 通信的原因:TCP的创建开销很大,创建需要三次握手,销毁需要四次握手。而且 TCP 可以被多个线程共享,显然线程比 TCP 要省事的多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。