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