RabbitMQ的简单介绍
1、RabbitMQ的简介
RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,它的并发能力强,性能极好,延迟极低,稳定性和安全性很高,同时还支持集群。RabbitMQ在分布式系统开发中应用非常广泛,是最受欢迎的开源消息中间件之一。
注意:由于RabbitMQ是采用erlang语言开发的,所以必须有erlang环境才可以运行
AMQP 协议:AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议),提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端、中间件等不同产品,不同开发语言等条件的限制。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。
JMS:即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
AMQP 与 JMS 区别
- JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
- JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
- JMS规定了两种消息模式;而AMQP的消息模式更加丰富
2、RabbitMQ的特点
RabbitMQ最初起源于金融系统,用在分布式系统中存储转发消息,在易用性、扩展性、高可用等方面表现不俗,具体特点包括:
- 可靠性:使用一些机制保证可靠性,如持久化、传输确认、发布确认。
- 灵活的路由:在消息进入队列之前,通过Exchange交换机来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起或开发自己的Exchange。
- 消息集群:多个RabbitMQ组成一个集群,形成一个逻辑的broker。
- 高可用:队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列下仍然可用。
- 多种协议:支持多种消息队列协议,比如STOMP、MQTT等。
- 多语言客户端:支持几乎所有常用语言,比如java、rubu、.NET等。
- 管理界面:提供了一个易用的用户界面,使得用户可以监控和管理消息的broker
- 跟踪机制:如果消息异常,rabbitMQ提供了消息跟踪机制,使用者可以找出发生了什么。
3、RabbitMQ的基础架构
RabbitMQ是AMQP协议的一个开源实现,所以其内部实际上也是AMQP中的基本概念,如下图所示:
- Publisher:消息生产者,就是投递消息的程序,也是一个向交换机发布消息的客户端应用程序。生产者发送的消息一般包含两个部分:消息体和内容标签。
- Consumer:消息消费者,也就是接收消息的一方。消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。
- Connection :网络连接,比如一个TCP连接,用于连接到具体Broker。
- Channel: 信道,AMQP 命令都是在信道中进行的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接,一个TCP连接可以用多个信道。客户端可以建立多个channel,每个channel表示一个会话任务。
- Broker服务节点:表示消息队列服务器实体。一般情况下一个Broker可以看做一个RabbitMQ服务器。
- Exchange:交换器,接受生产者发送的消息,根据路由键将消息路由到绑定的队列上。
- Queue:消息队列,用来存放消息。一个消息可投入一个或多个队列,多个消费者可以订阅同一队列,这时队列中的消息会被平摊(轮询)给多个消费者进行处理。
- Message:消息,由消息体和标签组成。消息体是不透明的,而标签则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
- Routing Key: 路由关键字,用于指定这个消息的路由规则,需要与交换器类型和绑定键(Binding Key)联合使用才能最终生效。
- Binding:绑定,通过绑定将交换器和队列关联起来,一般会指定一个BindingKey,通过BindingKey,交换器就知道将消息路由给哪个队列了。
- Virtual host:虚拟主机,用于逻辑隔离,表示一批独立的交换器、消息队列和相关对象。一个Virtual host可以有若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段。
4、Exchange交换器的类型
Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers,由于headers交换器和direct交换器完全一致,且性能差很多,目前几乎用不到。这里只看direct、fanout、topic这三种类型:
- direct(直连):消息中的路由键(RoutingKey)如果和 Bingding 中的 bindingKey 完全匹配,交换器就将消息发到对应的队列中。是基于完全匹配、单播的模式。
- fanout(广播):把所有发送到fanout交换器的消息路由到所有绑定该交换器的队列中,fanout 类型转发消息是最快的。
- topic(主题):通过模式匹配的方式对消息进行路由,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。匹配规则:
- ① RoutingKey 和 BindingKey 为一个 点号 '.' 分隔的字符串。 比如: stock.usd.nyse;可以放任意的key在routing_key中,当然最长不能超过255 bytes。
- ② BindingKey可使用 * 和 # 用于做模糊匹配:*匹配一个单词,#匹配0个或者多个单词;
headers:不依赖于路由键进行匹配,是根据发送消息内容中的headers属性进行匹配,除此之外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了。
5、RabbitMQ的几种模式
RabbitMQ提供了6种模式:
- 简单模式:一对一模式,只有一个生产者,一个队列,一个消费者,是最简单的模式。
- 工作队列模式:一对多模式,一个消息生产者,一个消息队列,多个消费者。
- Publish/Subscribe发布与订阅模式:无选择接收消息,一个消息生产者,一个交换器,多个消息队列,多个消费者。
- Routing路由模式:在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。
- Topics主题模式:同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息,比第四类更灵活(也是最常用的一种)。
- RPC远程调用模式(远程调用,不太算MQ;不作介绍)