ampq第三章

3.1 Session定义
Session 是AMQP对等端之间的命名的交互,session 名局限于一个认证机构(authentication principal),并且session名字由应用层程序来决定。在参与交互的对端之一,或者两者上可能保存session的状态。发布一个消息,创建一个队列,或者选择一个事务模式的命令必须发生在一个session的context之内。
Session是AMQP其他部分的基础。

Session 可以被看做:
AMQP内建的刚好一次递交操作的context
网络协议映射和model层之间的接口
诸于队列,交换器,订阅这些实体的生命周期的一个范围域
命令标识符的一个范围域

3.1.1 session 生命期
Session 不是显式地被创建或者被摧毁,在某种意义上,session 一直存在。对等端必须试着去附着(attach)到它的对端的session上,而不是去创建一个session。然后,这个附着请求的接收者会去查看它是否正持有该session的状态。

对端双方在附着到一个session上,它们必须保留session的相关状态。当session分离了(不管是通过显式的分离请求,还是对等端之间的网络连接断开),那么session的状态还会被保留一段时间,这个时间是由先前对等端双方协定好的。

3.1.2 命令传输
AMQP模型的交互是通过在对等端之间发送”命令”。这些命令高效地在session上发送。当一个命令从model层到session时,它被授予一个标识符。这些标识符能够用来把命令和其结果关联起来,或者在异步AMQP命令流上执行同步。

3.1.3 session 作为一个层次
Session 充当了网络协议映射层和model层之间的接口。尤其是,当对等端双方都保留session的状态时,它可以被用来作为一个机制,保证命令刚好递交一次。
Session state 至少由如下组成:
一个replay 缓存区,存放对等端还没有确认收到的整个命令,或者命令的一部分
一个幂等的栅栏 – 一组命令标识符,对等端知道这些命令已经接收到了,但是不能确定对方是不是会重发。

因为session名是由应用层程序指定的,除了这里详细说明的状态之外,可能还有其他更多的状态。这些额外的状态可能(例如)在session状态过期是,会被用来执行恢复。然而,在这章,当我们谈到session状态,我们将只会指session层持有的那些状态。

3.2 session 的功能
Session 层提供了几个关键的服务,model层构建在这些服务之上:
命令顺序化标识
将要执行命令的确认
命令完成时发通知
网络失败的重放,恢复
对端失败后,状态协调

3.2.1 顺序化的标识
对等端发出的每个命令必须被标识,为了在整个系统内,能保证命令刚好一次执行。
Session层使用一个顺序编号的机制来标识每个命令,使得命令在一个session内是唯一的。

标识这个概念,使得可以异步地把命令和起结果关联起来。Model层可以看到命令的标识符。当一个命令的结果返回时,可以用命令标识符来关联到是哪个命令的执行结果。

3.2.2 确认
为了使对等端能够安全地丢弃一个给定命令的状态,它必须接收到一个该命令将会被执行的保证。更精确地说,发送者必须接收到一个确认该命令已经被执行,或者它的递交被保留到期望的时间长度。

实际上,你可能会通过一个消息传输系统发送两种类型的消息:持久消息和瞬间消息。对于瞬时消息,一般来说,消息传输系统和应用程序之间的协定是,消息可能在消息传输系统丢失瞬时状态时,消息可能会被丢失。对于一个持久消息,消息传输系统必须保证消息被保存在最持久的的存储中。

Session 层处理消息确认的发送和接收。这使得session层可以管理它需要持有的状态,能够在对等端临时失败时,或者传输失败时,通过这些状态能够进行恢复。

确认可以批量或者不确定地延迟。尤其是如果一个对等端不需要紧急的确认通知,确认可以被忽略掉,因为它仅仅是意味着一个命令的完成。

3.2.3 命令完成
从确认概念独立出来的是命令完成概念。为了同步和确保不同session间的完全有序化的目的,因此很有必要在一个命令执行完成时通知到对等端。

在对等端没有请求紧急完成通知的地方,比如通知可以延迟或者可以批量发送,这适用于一命令范围。这减小了网络的流量。

例如,如果3个队列按顺序声明,如命令1到3。服务器可能会像如下这下通知命令完成

注意,命令的接收方将会发送整个已经完成的命令集(这里不明白啥意思,比较难翻)

3.2.4 重放和恢复
一般地,AMQP系统应该能够处理临时的网络失败,或者AMQP 服务器cluster 中的单点失败。为了能够从这些失败中幸存,session必须用来重放在失败点接收有疑问的命令。Session 层提供必要的工具来标识有疑问的命令集,并且在无重复递交风险的情况下重放这些命令

你可能感兴趣的:(ampq)