RabbitMQ
核心概念
- 规范:
AMQP
,几乎支持全部常用语言 - 语言:
Erlang
- 单机吞吐量:万级
- 时效性:us
- 高可用性:主从架构
- 消息丢失:可能性低
- 消息推拉模式:Push/Pull
- 特性:并发能力强、延时非常低、通过
http://yourIP:15672/
可以可视化访问
核心概念
1. 生产者(Producer)& 消费者(Consumer)
2. 消息(Message)
包括消息头(或称Label)和消息体(或称payLoad)。
消息头由一系列可选属性组成,包括
routing-key
路由键、priority
优先级、delivery-mode
(指出该消息可能需要持久化存储)
3. 交换器(Exchange)
Exchange相当于一个路由表,用于接收生产者发送的消息并将这些消息路由给服务器中的队列,如果路由不到,或许可能返回给生产者,或许会被直接丢弃掉。
Producer将Message交给Exchange时,会指定一个RoutingKey(路由键),用于指定这个消息的路由规则,而这个RountingKey需要与“交换器类型”和“绑定键(BindingKey)”联合使用才能最终生效。
1.Producer将Message发送给Exchange时需要一个RoutingKey,当RoutingKey和BindingKey匹配时,消息会被路由到对应Queue;
2.BindingKey并不是所有情况都有效,它依赖于Exchange类型,比如fanout
类型的Exchange就会无视BindingKey。
(1)绑定(Binding) & 绑定键(BindingKey)
RabbitMQ
中通过绑定将Exchange和Queue关联起来,绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ
就知道如何正确将消息路由到队列了。
(2)交换器类型
direct
:默认。把所有发送到该Exchange的消息路由到BindingKey和RountingKey匹配的Queue中。常用在有优先级的任务,根据任务优先级将消息发到不同队列,这样可以分配更多资源给高优先级队列。fanout
:把所有发送到该Exchange的消息路由到与它绑定的所有Queue中,不需要做任何判断,所以速度最快。常用于广播消息。topic
:是一种优化的direct
,把所有发送到该Exchange的消息路由到BindingKey和RountingKey匹配的Queue中,但是匹配规则支持多字符串、支持模糊匹配。1.通过
.
分隔字符串,比如java.util.concurrent
;通过
*
匹配任意单词、#
匹配0或多个单词,如java.util.*
/#.concurrent
headers
:不推荐,性能较差,根据headers属性进行匹配。
4. 消息队列(Queue)
Queue保存消息直到被消费者消费。
RabbitMQ
的消息只能保存在消息队列,Kafka
的消息只能保存在topic
多个Consumer可以订阅同一个Queue,这时队列中的消息会轮询交给多个Consumer处理,而不是每个Consumer都收到所有消息。