在Dynamo 论文的 Section 5 中,有以下内容:
特别是,由于每次写入通常都在读取操作之后,因此写入的协调器被选择为对存储在请求的上下文信息中的先前读取操作响应最快的节点。这种优化使我们能够选择具有先前读取操作读取的数据的节点,从而增加获得“read-your-writes”一致性的机会。
获得“read-your-writes”一致性的机会如何增加?
“read-your-writes”意味着在写入之后的读取获取写入设置的值。读取和写入由两个不同的客户端为此上下文执行。原因是写入协调器的选择不会影响同一客户端获得“read-your-writes”的机会。
但是上面的文字是在谈论读取之后的写入。这是我的猜测。如果可能,读取协调器将尝试进行语法协调。如果由于版本不同而无法进行语法协调,则客户端需要在写入之前进行语义协调。无论哪种方式,读取操作中涉及的所有节点上的版本都是协调版本的祖先。因此,可以将以下写入发送给其中任何一个以进行应用。读取看到写入的最早时间是在完成以下步骤之后:
- 客户联系写协调员。
- 写协调器为新版本生成版本时钟。
- 写入协调器在本地写入新版本。
执行上述步骤的时间越短,另一个后续阅读看到新版本的可能性就越大。因为很有可能对先前读取响应最快的节点可以在更短的时间内执行以下步骤。这样一个节点被选为写协调器。