书二 传输
2.1 传输
AMQP网络是由结点通过链路来组成的。结点是被命名了的实体,是为了安全的存储或者发送消息。消息可以通过结点产生、终止或者转发。
在两个结点之间的链路是单一的路由通道。链路依附在终点的结点上。有两种类型的终点:源和目的。终点是用来追踪出入方向消息的特定流的状态。源终点追踪出方向消息,目的终点追踪入方向消息。如果消息在源点满足标准的规格,那可能是只沿着单独的链路传输。
消息在AMQP网络中传输的时候,在结点中传输消息就会碰到安全存储和发送消息的问题。链路协议(在2.6章节中定义)管理在源和目的端的传输。
+--------------------------+ +-----------------------+
/ Node A \ / Node B \
+--------------------------+ +--filter +-----------------------+
| | / | |
| MSG_3 <MSG_1> | _/ _ | MSG_1|
| |(_)------------------>(_)| |
| <MSG_2> MSG_4 | | | | MSG_2 |
| | | Link(Src,Tgt) | | |
+--------------------------+ | | +-----------------------+
| |
Src Tgt
Key: <MSG_n> = old location of MSG_n
结点是在存在在容器中的,每个容器可能会包含很多结点。AMQP结点的例子有生产者、消费者和队列。在一个客户端应用中生产者和消费者是产生和处理消息的基本单元。队列做为中间者的实体保存和转发消息。容器的例子有中间者和客户端应用。
+----------------------+ +---------------+
| <<Container>> | 1..1 0..n | <<Node>> |
|----------------------|<>------------------------>|----------------|
| container-id | | name |
+---------------------+ +---------------+
/_\ /_\
| |
| |
+-----+-----+ +----------------+--------------+
| | | | |
| | | | |
+---------+ +--------+ +-------------+ +---------------+ +----------+
| Broker | | Client | | Producer | | Consumer | | Queue |
|----------| |---------| |--------------| |---------------| |-----------|
| | | | | | | | | |
+---------+ +--------+ +-------------+ +---------------+ +----------+
在AMQP网络中,AMQP传输规格定义了端到端协议在结点之间传输消息。规格的这部分内容并不关心结点内部的工作原理,只是处理在两个结点间传输消息的机制。
容器是通过连接通信的。AMQP的连接是由双工和帧序列组成的。连接的精确的需求是如果第n个帧到达的时候,早于第n个帧之前的帧都应该已经到达。假设连接是暂时的或者是因为某种不确定因素导致部分帧丢失,这种情况下也要保证顺序到达的规格。这个有点类似于TCP或者SCTP保证字节流的情况,同时规格中定义了一个组帧系统用来解析字节流到帧序列中去,以便用于建立一个AMQP的连接(可参考2.3节)。
AMQP的连接是被分成独立的单向信道的一个协商号中的。每个帧都被标记上信道号以便于标识它的父信道,同时每个信道中的帧序列是被多路复用的分配到一个连接中的唯一的帧序列中的。
AMQP的一个会话关联两个独立的信道,在两个容器间组成一个双向的、有序的对话。一个连接可能同时有多个独立的活动会话,数量可以达到协商信道的极限。连接和会话都可以把对端模型化成一个终结点,这个终结点能记录本地和远端最后的状态。
Session<----------+ +----------->Session
(ICH=1, OCH=1) | | (ICH=1, OCH=1)
\|/ \|/
Session <--> Connection <---------> Connection <-->Session
(ICH=2, OCH=3) /|\ /|\ (ICH=3, OCH=2)
| |
Session<-----------+ +----------->Session
(ICH=3, OCH=2) (ICH=2, OCH=3)
Key: ICH -> Input Channel, OCH -> Output Channel
Figure 2.1: Session & Connection Endpoints
会话在源和目的端的通信中提供上下文。一个连接点关联一个会话点为终点。在会话中,连接协议(定义在2.6节)被用来在源和目的端建立连接,并通过它们传输消息。一个会话可以同时关联到过个连接上。
+-------------+
| Link | Message Transport
+-------------+ (Node to Node)
| name |
| source |
| target |
| timeout |
+-------------+
/|\ 0..n
|
|
|
\|/ 0..1
+-------------+
| Session | Frame Transport
+-------------+ (Container to Container)
| name |
+-------------+
/|\ 0..n
|
|
|
\|/ 1..1
+----------------+
| Connection | Frame Transport
+----------------+ (Container to Container)
| principal |
+----------------+
帧是在传输线路上的工作单元。链接有一个协商号的最大帧大小,链接也允许字节分片到帧主体中去独立的解析,解析的格式在2.7节定义。下边的表列出了所有的帧主体以及定义哪个端点处理它们。
Frame Connection Session Link
========================================
open H
begin I H
attach I H
flow I H
transfer I H
disposition I H
detach I H
end I H
close H
-----------------------------------------------------------------------
Key:
H: handled by the endpoint
I: intercepted (endpoint examines
the frame, but delegates
further processing to another
endpoint)