一、概念
RabbitMQ是实现了 高级消息队列协议(AMQP)的开源 消息代理软件(亦称 面向消息的中间件)。RabbitMQ服务器是用 Erlang语言编写的,而群集和故障转移是构建在 开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端 库。
MQ全称为Message Queue, 消息队列(MQ)是一种 应用程序对 应用程序的通信方法。 应用程序通过读写出入队列的消息(针对 应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如 远程过程调用的技术(摘自网络)
二、用途
消息系统允许软件、应用相互连接和扩展。这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接。消息系统通过将消息的发送和接受分离开来实现应用程序的异步和解耦。
以下场景可以使用消息机制:
- 数据传输
- 非阻塞的操作,异步执行过程
- 推送通知
- 使用发布/订阅机制
- 使用一个工作队列
三、特性
- 可靠性(Reliability):RabbitMQ通过数据持久化,传输ack,发送确认,高可用的特性来保证她的高可靠性。
- 可集群(Clustering):通过一个逻辑中间人的形式,许多RabbitMQ的服务在同一的网络可以实现集群。
- 灵活路由(Flexible Routing):消息到达消息队列之前可以通过exchanges实现路由,RabbitMQ针对传统的路由逻辑类型,内置了几种消息exchanges类型。处理复杂的路由你可以把这些exhchange绑定使用,甚至可以自己写exchange类型,以插件的方式使用。
- 可联盟(Federation):For servers that need to be more loosely and unreliably connected than clustering allows,RabbitMQ提供了联盟模式。
- 高可用的队列(Highly Available Queues):队列能在集群中跨机器镜像,从而保证即使一些设备故障,你的信息还是安全的。
- 多协议支持(Multi-protocol):提供多协议支持。
- 多客户端支持(Many Clients): 提供多种语言的客户端支持。
- 可视化管理(Management UI):提供了简单易用的可视化管理界面管理你的RabbitMQ。
- 可追踪(Tracing):如果你的消息系统出现异常,你可以通过轨迹记录查出问题所在。
- 插件支持(Plugin System):RabbitMQ提供了许多的插件来按照你自己的方式扩展她。
四、AMQP是一个可编程协议
AMQP 0-9-1是一个可编程协议,某种意义上说AMQP的实体和路由规则是由应用本身定义的,而不是由消息代理定义。包括像声明队列和交换机,定义他们之间的绑定,订阅队列等等关于协议本身的操作。
应用程序(Applications)声明AMQP实体,定义需要的路由方案,或者删除不再需要的AMQP实体。
- 交换机和交换机类型
除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:
- Name:声明一个交换机需要一个名字。
- Durability:持久性、消息代理重启后,交换机还在存活。
- Auto-delete:当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它
- Arguments:依赖代理本身。
- 默认交换机
- 直连交换机
直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的。直连交换机用来处理消息的单播路由(unicast routing)(尽管它也可以处理多播路由)。
工作机制:
- 将一个队列绑定到某个交换机上,同时赋予该绑定一个路由键(routing key)。
- 当一个携带着路由键为R的消息被发送给直连交换机时,交换机会把它路由给绑定值同样为R的队列。
图形示例:
- 扇形交换机
扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的N个队列。扇型用来交换机处理消息的广播路由(broadcast routing)。
工作机制:
- n个队列绑定到一个扇形交换机上。
- 当消息发送到这个交换机上,这个消息会被分发给与之绑定的所有队列里。
图形示例:
- 主题交换机
主题交换机(topic exchanges)通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(multicast routing)。
- 头交换机
有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。