RabbitMQ之AMQP协议

一. 协议

AMQP协议是分层的,类似于OSI或TCP/IP协议分层。从图中可以看出分三层:

RabbitMQ之AMQP协议_第1张图片

1. Model Layer:规范服务器端Broker的行为。

2. Session Layer:定义客户端 与服务器端Broker的Context。

3. Transport Layer:传输二进制数据流。

二. 模型

AMQP服务器Broker主要由Exchange和Message Queue组成,主要功能是Message的路由Routing和缓存Buffering。

RabbitMQ之AMQP协议_第2张图片

Exchange接受Producer发送的Message并根据不同路由算法将Message发送到Message Queue。Message Queue会在Message不能正常消费时将其缓存起来,但是当Consumer与Message Queue之间的连接通畅时,Message Queue将Message转发给Consumer。

Message由Header和Body组成,Header是由Producer添加的各种属性的集合,包括Message是否被缓存,由哪个Message Queue接受,优先级是多少等。而Body是真正需要传输的APP数据。

Exchange与Message Queue之间的关联通过Binding来实现。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue,流程如下图:

RabbitMQ之AMQP协议_第3张图片

Binding Key由Consumer在绑定Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。

Exchange Type分为Direct(单播),Topic(组播),Fanout(广播)。当为Direct时,Routing Key必须与Binding Key相等时才能匹配成功[如果routing key匹配,那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个Exchange。],当为Topic时,Routing Key与Binding Key符合一种模式关系即算匹配成功[对key进行模式匹配,比如ab*可以传递到所有ab*的queue],当为Fanout时,不受限制。默认Exchange Type是Direct。

Virtual Host是个虚拟概念,可以持有一些Exchange和Message Queue。一个Virtual Host可以是一台服务器,也可以是由多台服务器组成的集群。Exchange和Message Queue可以分别部署在一台或者多台服务器上。

三. 通信

在AMQP中,Client通过与Broker之间建立Connection来通信,而Connection建立在Client与Virtual Host之间。而在每个Connection上可以运行多个Channel,每个Channel执行与Broker的通信,Session依附于Channel之上。Channel是Client与Broker之间传输Message的实体。在通信的时候,会为每个Command分配一个唯一的标示符即UUID,用于Command做校验和重传。

Client默认使用guest/guest访问权限和访问虚拟主机的根目录,这些默认项也是RabbitMQ的默认安装选项。

你可能感兴趣的:(rabbitmq)