chain(2)

A Storage Service Interface(存储服务接口)

存储服务的客户端发出查询和更新操作的请求。 尽管有可能确保可以执行到达存储服务的每个请求,但是端到端的论点表明这样做毫无意义。 如果存储服务为接收到并完成的每个请求简单地生成一个答复,则Client会更好,因为这也允许处理丢失的请求和丢失的答复:如果经过了太多时间而没有收到回复,则Client会重新发出请求。

  • query请求(objId,opts)的reply是从对象objId的值派生的; 选项 opt表征了返回objId的哪些部分。 objId的值保持不变。
  • 对update更新(objId,newVal,opts)的reply取决于选项opt,通常情况下,可以是以某种不确定的预编程方式产生的值V,该值涉及objId或当前的值newVal; 然后V成为objId的新值。

查询操作是幂等的,但更新操作却往往不是。 因此,重新发出非幂等更新请求的客户端必须采取预防措施,以确保更新尚未执行。 例如,客户端可能首先发出查询以确定对象的当前值是否已经反映了更新。(注:客户端先查询,但是查询出的结果以什么为基准呢?)

在到达存储服务之前丢失的客户端请求对于该客户端与被存储服务忽略的客户端是无法区分的(注:请求未达到或请求被服务端忽略)。 这意味着当存储服务器出现短暂的中断而客户端请求被忽略时,客户端将不会面临新的故障模式。 当然,可接受的客户端性能可能取决于限制瞬时中断的频率和持续时间。

使用链式复制,每次短暂中断的持续时间都远远短于删除有故障的主机或添加新主机所需的时间。 因此,面对故障,恢复和其他重新配置时,客户端请求处理将以最小的中断进行。 大多数其他副本管理协议要么阻止某些操作,要么牺牲失败后和重新配置期间的一致性保证。

image.jpeg

我们通过为客户端提供对象状态以及响应查询和更新请求的对象状态转换的视图,从而指定存储服务的功能。 图1使用伪代码为对象objID提供了这样的规范。

该图通过两个变量来定义objID的状态:对objID执行的更新序列HistObjId和一组未处理的请求PendingObjId。

然后,该图列出了可能的状态转换。 T1说明已将到达的客户端请求添加到待处理的集合PendingobjID中。 T2指定了一些暂挂的请求将被忽略——大概不会太频繁地进行此过渡。 T3给出了请求处理的高级视图:首先从PendingobjID中删除请求r; 查询将导致生成适当的响应,而更新也将r附加到HistobjID

你可能感兴趣的:(chain(2))