谷歌云存储一个文件同时可多次访问


Google Cloud Storage One file multiple access at the same time

我在GAE Projekt中使用GoogleCloudStorage,我想知道当我同时访问一个文件的两个实例时会发生什么。我创建了一个PHP脚本,打开一个文件,读取它的内容,添加一些内容,然后像这样保存:

$userContent = json_decode(file_get_contents("*** link ***"));
$userContent->abc = "test"; // Do some changes
file_put_contents("*** link ***", json_encode($userContent);

我担心的是,当我打开文件时,另一个实例也会打开它,数据会丢失。那么在这种情况下会发生什么呢?

  • 文件是否已锁定,而另一个实例正在等待
  • 文件是否已锁定,另一个实例是否中止
  • 数据丢失了吗

谷歌云存储本身不强制执行锁定。对GCS对象的读取和写入都是原子——每次读取都将完全从一个版本中获取对象的内容;每次写入都将完全替换对象。任何"中间阶段"(对象的一部分来自一个版本,其余来自另一个版本)都不可能存在。

当然,如果多个任务试图独立地"修改"GCS对象,并且没有以某种方式在它们之间同步或协商,则"丢失数据"的可能性很大!这是因为GCS没有"修改"对象的概念:只有读取对象,完全替换

因此,试图"修改"GCS对象的任务实际上会读取它,修改它在内存中的任何内容,然后用该内存的内容覆盖对象。如果多个任务独立地"覆盖"同一个对象,最后一次覆盖将"获胜",并抹杀之前的任务。

我不知道什么是"GAP Projekt",但假设我们实际上谈论的是GAE(根据标签),那么一个GAE应用程序的多个实例使用memcache或GAE数据存储等共享资源在它们之间同步是相当容易的。按照惯例,这些资源将用于表示哪个实例"当前拥有"GCS对象;另一个实例将等待轮到它。。。

没有锁定-如果您同时以不同的方式修改数据,那么您的数据很可能会丢失。

也可以依赖GCS前提条件

这只允许在读取后未更改文件的情况下更新文件。参见文档:

预条件通常用于更改请求(上传、删除、复制或元数据更新),以防止出现竞争条件。当重复发送同一请求或独立进程相互干扰时,可能会出现争用情况。例如,网络中断后的多次请求重试,或者用户对同一对象执行读取-修改-写入操作,都可能造成竞争条件。