RabbitMQ的架构如图:
Producer:
生产者,投递消息。
Consumer:
消费者,接收消息。
Broker:
RabbitMQ集群中的一个服务节点或RabbitMQ服务实例。
Queue:
队列。RabbitMQ的内部对象,用于存储消息。RabbitMQ中消息只能存储在队列中,而kafka是将消息存储在topic中的partition中。
Exchange:
交换器。生产者将消息发送到Exchange,由交换器将消息路由到一个或多个队列中,如果路由不到,可能会返回给生产者,也可能直接丢弃。
Exchange交换器类型:
fanout:
它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
direct:
它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中。
topic:
topic是模糊匹配,有一些约定的规则:
- RoutingKey为一个点号“.”分隔的字符
- BIndingKey和RoutingKey一样也是“.”分隔的字符串
- BindingKey中可以存在两种特殊字符串,用于做模糊匹配,其中“*”用于匹配一个关键字,“#”用于匹配一个或多个关键字。
headers:
它不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,RabbitMQ会获取带该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。
RoutingKey:
路由键。生产者将消息发送给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才生效。
在交换器类型和绑定键固定的情况下,生产者可以在发送消息给交换器的时候,通过指定RoutingKey来决定消息流向哪里。
Binding:
绑定。RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确的将消息路由到队列了。
生产者将消息发送给交换器时,需要一个RoutingKey,当BIndingKey和RoutingKey相匹配时,消息会被路由到对应的队列中。在绑定多个队列到同一个交换器的时候,这些绑定允许使用相同的BindingKey。
Connection:
用于生产者和消费者与Broker建立连接,就是一条TCP连接。
Channel:
一旦上述的TCP连接建立起来,客户端紧接着可以创建一个AMQP信道(Channel),每个信道都会被指派一个唯一的ID。
信道时建立在Connection上的虚拟连接,RabbitMQ处理的每条AMQP指令都是通过信道完成的。