RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理(英语:Message broker)软件(亦称面向消息的中间件(英语:Message-oriented middleware))。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在OTP(Open Telecom Platform)上的。全部主要的编程语言均有与代理接口通信的客户端函式库。算法
RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。编程
在消息进入队列以前,经过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,能够将多个 Exchange 绑定在一块儿,也经过插件机制实现本身的 Exchange 。安全
多个 RabbitMQ 服务器能够组成一个集群,造成一个逻辑 Broker 。服务器
队列能够在集群中的机器上进行镜像,使得在部分节点出问题的状况下队列仍然可用。网络
RabbitMQ 支持多种消息队列协议,好比 STOMP、MQTT 等等。架构
RabbitMQ 几乎支持全部经常使用语言,好比 Java、.NET、Ruby 等等。编程语言
RabbitMQ 提供了一个易用的用户界面,使得用户能够监控和管理消息 Broker 的许多方面。分布式
若是消息异常,RabbitMQ 提供了消息跟踪机制,使用者能够找出发生了什么。性能
RabbitMQ 提供了许多插件,来从多方面进行扩展,也能够编写本身的插件。网站
先放一张主要结构图
Broker(能够理解为RabbitMQ)从发布者(发布消息的应用程序,也称为生产者)接收消息,并将其路由到消费者(处理消息的应用程序)。
Exchange是 AMQP 0-9-1实体,用于发送消息。 Exchange接收消息并将其路由到零个或多个队列。 所使用的路由算法取决于称为绑定的交换类型和规则。 Amqp 0-9-1型经纪商提供四种交易所类型:
类型 | 默认名称 |
---|---|
Direct exchange | 空字符串或amq.direct |
Fanout exchange | amq.fanout |
Topic exchange | amq.topic |
Headers exchange | amq.match(以及 RabbitMQ 中的 amq.headers) |
默认交换是直接交换,没有代理预先声明的名称(空字符串)。 它有一个特殊的属性,这使得它对简单的应用程序很是有用: 建立的每一个队列都自动用与队列名相同的路由键绑定到它。
直接交换器根据邮件路由键将邮件传递到队列。 直接交换对于消息的单播路由是理想的(尽管它们也能够用于广播路由)。 如下是它的工做原理:
扇出(叫广播可能好理解一些)交换将消息路由到绑定到它的全部队列,而路由键被忽略。 若是 n 个队列绑定到扇出交换器,当新消息发布到该交换器时,该消息的副本将传递到全部 n 个队列。 扇出交换是消息广播路由的理想选择。也就是说发送消息的key变成了Exchange,消费者能够直接经过Fanout Exchange拉去消息,实现广播/主题订阅。
由于扇出交换机向每一个绑定到它的队列发送一个消息的副本,它的用法很是类似:
主题交换根据消息路由键与用于将队列绑定到交换机的模式之间的匹配将消息路由到一个或多个队列。 话题交换类型一般用于实现各类各样的发布/订阅模式变化。 主题交换一般用于消息的多播路由。
主题交换有一组很是普遍的用例。 每当一个问题涉及到多个消费者 / 应用程序,这些消费者 / 应用程序有选择地选择要接收哪一种类型的消息时,就应该考虑使用主题交换。
与Fanout Exchange不一样的是,Topic Exchange支持更多形式的绑定,能够动态的将Queue绑定在Exchange,更加灵活。
使用场景:
Header 交换是为了在多个属性上进行路由而设计的,这些属性比路由键更容易表示为消息Header。Header Exchange会忽略RoutingKey。 相反,用于路由的属性取自 header 属性。 若是消息头的值等于绑定时指定的值,则认为消息是匹配的。
队列,在使用队列以前,必须声明它。 若是队列不存在,则声明该队列将致使建立该队列。 若是队列已经存在而且其属性与声明中的属性相同,则声明将没有任何效果。 当现有队列属性与声明中的属性不一致时,将引起代码为406(pretirement failed)的通道级异常。
绑定是Exchange将消息分发到队列的规则。 要实现交换机 E 将消息分发到队列 Q,Q 必须绑定到 E。绑定可能具备某些交换机类型使用的可选路由键属性。 RoutingKey的用途是选择发布到交换器的某些消息,以便将其分发到绑定队列。 换句话说,RoutingKey的做用相似于过滤器。
消费者。每一个消费者(订阅)都有一个标识符,称为ConsumerTag。 它能够用来退订消息。 ConsumerTag只是一个字符串。
简称ACK,消息确认机制。
因为网络不可靠,应用程序失败,所以一般须要某种形式的处理确认。 在消费成功后,能够显式的通知Broker消息处理完成。
一半链接的存活周期是比较长的,一个Connection对应一个TCP链接。为了提升性能,不会每次接受/发送消息都建立新链接,因此设计了Channel的概念。
有些应用程序须要多个到Broker的链接。 可是,同时打开多个 TCP 链接是不合适的,由于这样作会消耗系统资源。 Amqp 0-9-1链接与通道复用,Channel能够认为是"共享单个 TCP 链接的轻量级链接"。
为了使单个Broker可以使用载多个独立的"环境"(用户组、交换器、队列等) ,AMQP 包含了虚拟主机(vhosts)的概念。 它们相似于许多流行 Web 服务器使用的虚拟主机,并提供 AMQP 实体所在的彻底隔离的环境。 Amqp 客户端指定在 AMQP 链接协商期间要使用的 vhosts。
能够经过Vhost来实现一些权限的功能,好比在多系统下共用一个MQ集群是,能够分配不一样的Vhost/User来控制数据的权限,保障安全。