AMQP
:即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语音等条件的限制。2006年,AMQP规范发布。类别HTTP。
2007年,Rabbti技术公司基于AMQP准备开发的RabbitMQ 1.0 发布。RabbtiMQ采用Erlang语音开发。Erlang语言由Ericson设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
RabbitMQ基础架构图如下
RabbitMQ中的相关概念:
Broker
:接收和分发消息的应用,RabbitMQ Server就是Message Broker
Virtual host
:处于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中namespace概念。当多个不同的用户使用同一个RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange / queue 等
Connection
:publisher / consumer 和 broker 之间的 TCP 连接
Channel
:如果每一次访问RabbitMQ都简历一个Connection,在消息量大的时候建立TCP Connection的开销将时巨大的,效率也较低,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)
Queque
:消息最终被送到这里等待 consumer 取走
Binding
:exchange 和 queue 之间的虚拟连接,binding 中可以包含routing key。binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据。
RabbitMQ提供了6种工作模式
:简单模式、work queues、Publish/Subscribe 发布与订阅模式、Routing 路由模式、Topics主体模式、RPC远程调用模式(远程调用,不太算MQ)。
官网对应模式介绍:https://www.rabbitmq.com/getstarted.html
JMS
- JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件的API
- JMS是JavaEE规范中的一种,类别JDBC
- 很多消息中间件都实现了JMS规范,例如:ActiveMQ。RabbitMQ官方没有提供JMS的实现包,但是开源社区有。
交换机类型
direct
:直接交换机,特点是消息队列通过routingKey与交换机进行绑定,相同的routingKey会获得相同的消息。一个队列可以通过多个不同的routingKey与交换机进行绑定。不同的队列也可以通过相同的routingKey绑定交换机。
fanout
:扇出交换机,特点是类似于广播,只要队列与该类型的交换机绑定,所有发送到该交换机的信息都会被转发到所有与之绑定的队列,与routingKey无关。
headers
:头交换机
topic
:主题交换机