RabbitMQ入门指南

简介

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,则交换将其路由到队列

image

Fanout Exchange

扇出(叫广播可能好理解一些)交换将消息路由到绑定到它的全部队列,而路由键被忽略。 若是 n 个队列绑定到扇出交换器,当新消息发布到该交换器时,该消息的副本将传递到全部 n 个队列。 扇出交换是消息广播路由的理想选择。也就是说发送消息的key变成了Exchange,消费者能够直接经过Fanout Exchange拉去消息,实现广播/主题订阅。
image
由于扇出交换机向每一个绑定到它的队列发送一个消息的副本,它的用法很是类似:

  • 大型多玩家在线(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来控制数据的权限,保障安全。

相关文章
相关标签/搜索