一、概述
RabbitMQ对消息可靠性的支持比较好。RabbitMQ是基于AMQP协议实现消息中间件。
二、RabbitMQ架构设计
-
Broker:RabbitMQ的服务节点。
-
Queue:队列,是RabbitMQ的内部对象,用于存储消息。RabbitMQ中消息只能存储在队列中。生产者投递消息到队列,消费者从队列中获取消息并消费。多个消费者可以订阅同一个队列,这时队列中的消息会被
平均分摊(轮询)给多个消费者进行消费,而不是每个消费者都接收到所有的消息进行消费。(注意:RabbitMQ不支持队列层面的广播消费,如果需要广播消费,可以采用一个交换器通过路由key绑定多个队列,由多个消费者定订阅这些队列的方式。) -
Exchage:交换器。生产者将消息发送到Exchange,由交换器将消息路由到一个或多个队列中。如果路由不到,根据配置策略不同,或返回给生产者,或直接丢弃,或做其他处理。
- 扇形交换器:将消息路由到绑定的所有队列中,不经过Routing key。
- Direct交换器:将消息路由到Routing Key与BindingKey相同的绑定的一个队列中。
- Topic交换器:将消息路由到与BindingKey与Routing Key匹配的一个或多个队列中。Routing Key可以是一个表达式。
- header交换器:通过解析消息头中的数据,匹配到一个或多个队列中。
-
Binding:通过绑定将交换器和队列关联起来,在绑定的时候一般会指定一个绑定键BindingKey,这样RabbitMQ就可以指定如何正确路由到队列了。
交换器和队列实际上是多对多关系。就像关系数据库中的两张表。它们通过BindingKey做关联(多对多关系表)。在投递消息时,可以通过Exchange 和RoutingKey(对应的BindingKey)就可以找到相对应的队列。
-
RoutingKey:路由key。生产者将消息发送给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则。这个路由key需要与交换器类型和BindingKey联合使用才能生效。在交换器类型和BindingKey固定的情况下,生产者可以在发送消息给交换器时通过指定RoutingKey来决定消息流向哪里。
-
Channel:信道。信道是建立在Connection之上的虚拟连接。当应用程序与Rabbit Broker建立
TCP连接的时候,使用的是长连接,客户端紧接着可以创建一个AMQP信道(Channel)。每个信道都会被指派一个唯一的ID。RabbitMQ处理的每条AMQP指令都是通过信道完成的。信道就像电缆里的光纤束。一条电缆内含有许多光纤束,允许所有的连接通过多条光纤束进行传输和接收。一个TCP连接中可以建立多个AMQP信道。 -
AMQP:Advanced Message Queuing Protocol,高级消息队列协议。