- 采用 Erlang 语言实现 AMQP的消息中间件
- 消息只能存储到队列里。一个消息可投入一个或多个队列。
- 多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理。避免重复消费。
- 不支持队列层面的广播消费。
- 特点
- 可靠性:使用一些机制来保证消息的可靠性,如持久化、传输确认及发布确认等。
- 灵活的路由:对于典型的路由功能,RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器
- 扩展性:可以组成和动态扩展集群
- 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用。
- 支持多种协议:除了原生支持 AMQP 协议,还支持 STOMP、MQTT 等多种消息中间件协议。
- 多语言客户端:几乎支持所有语言
- 易用的管理界面
- 插件机制:可以添加插件也可以自己编写插件
核心概念
-
整体上是生产者和消费者模型
-
角色
- 生产者
- 生产者把消息发给RabbitMQ,RabbitMQ根据消息头将其发给感兴趣的消费者
- 指定RoutingKey(路由键),用来指定这个消息的路由规则
- RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效
- 消费者
- 生产者
-
交换机(Exchange)
- 生产者→交换机→RabbitMQ
- Exchange(交换器) 用来接收生产者发送的消息并将这些消息路由给服务器中的队列中,如果路由不到,或许会返回给 Producer(生产者) ,或许会被直接丢弃掉
- 通过 Binding(绑定) 将 Exchange(交换器) 与 Queue(消息队列) 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列
- 在绑定多个队列到同一个交换器的时候,这些绑定允许使用相同的 BindingKey
- 在RabbitMQ中有四种,分别对应不同的路由策略
- direct(默认)
- 常用在处理有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列
- fanout
- 把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作
- 是所有的交换机类型里面速度最快的
- 常用来广播消息
- topic
- 也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但匹配的规则不一样
- BindingKey 和 RoutingKey 为一个点号“.”分隔的字符串
- BindingKey 中可以存在两种特殊字符串“”和“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。
- headers(不推荐)
- 不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配
- 获取该消息的 headers(也是一个键值对的形式)'对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列
- direct(默认)
-
Broker
- 可以简单看作消息中间件的服务节点或RabbitMQ服务实例。大多数情况下也可以将一个 RabbitMQ Broker 看作一台 RabbitMQ 服务器