在了解 RabbitMQ 之前,我们先了解 RabbitMQ 底层的一些东西。
AMQP 简介
AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议 的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中 间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。类比HTTP。
RabbitMQ 简介
2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。 Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
RabbitMQ 是一个消息中间件。它能够接收并转发消息,我们可以把它类比成一个快递站点,我们可以将我们的快递拿到快递站点去,并最终由快递员将你的快递送到目的地去。而 RabbitMQ 与快递站点的区别是:RabbitMQ 并不会去处理消息,而不是单纯的对消息进行接收,存储和转发。
RabiitMQ 核心部件
生产者 Produce
从上面的例子来说,生产者就是我们。从代码的角度来说,产生数据发送消息的程序就是生产者。
交换机 Exchange
交换机是 RabbitMQ 中的一个重要部件。它一方面接收生产者生产的消息,另一方面它将消息推送到相应的队列中。在这个推送的过程中,我们可以通过设置交换机的类型来实现是要将什么样的内容推送到哪些队列中去。
队列 Queue
队列是 RabbitMQ 内部使用的一种数据结构。RabbitMQ 将生产者生产的所有消息都存储在队列中,从而使消费者能够从队列中将消息取出。从而实现消息的存储和转发。
消费者 Consumer
与生产者相反,消费者是获取数据的程序。
RabbitMQ 核心概念
Broker:用来形容接收和分发消息的应用。如:RabbitMQ Server 就是 Message Broker
Virtual host:虚拟主机。是 RabitMQ 出于多租户和安全因素设计的,将把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:连接。生产者(publisher)或消费者(consumer) 与 broker 之间的 TCP 连接
Channel:信道。目的是减少客户端与 RabbitMQ 的连接开销。
原因如下:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCPConnection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的Connection 极大减少了操作系统建立 TCP connection 的开销
Exchange:交换机。message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout(multicast)
Queue:队列。消息最终被送到这里等待 consumer 取走
Binding:exchange 和 queue 之间的虚拟连接。binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
RabbitMq 基本架构图
RabbitMQ 的六种工作模式
RabbitMQ 更新到现在,其实已经有了七种工作模式了,但是其中的 RPC 模式严格意义上不太算 MQ,因此我们在此只对其他的六种工作模式进行简单的了解,不进行代码操作。它们分别是:
在此之前我们要对等会出现的流程图中的字母有一些概念:
- p:生产者
- c:消费者
- 红框:队列
- x:交换机
- 第一种:简单模式(Hello World!)
- 第二种:工作队列模式(Work Queues)
- 第三种:发布订阅模式(Publish/Subscribe)
- 第四种:路由模式(Routing)
- 第五种:主题模式(Topics)
- 第六种:发布确认模式(Publisher Confirm)
在了解完 RabbitMQ 的六种工作概念后,我们就来通过代码进行实现,不过这也是下一篇文章的内容了。