Google Cloud Storage One文件同时具有多个访问权限

时间:2015-03-28 19:09:14

标签: php google-app-engine google-cloud-storage

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

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

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

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

3 个答案:

答案 0 :(得分:6)

谷歌云存储本身并没有锁定。对GCS对象的读取和写入都是原子 - 每次读取都将完全从一个版本获取对象的内容;每次写入都将完全取代对象。没有“中间阶段”(部分对象来自一个版本,其余部分来自另一个版本)可能存在。

但是当然,如​​果多个任务试图独立地“修改”一个GCS对象并且不知何故在它们之间进行同步或协商,那么 很可能“丢失数据”!这是因为GCS没有“修改”对象的概念:只有读取对象,完全替换对象。

因此,尝试“修改”GCS对象的任务实际上会读取它,修改它在内存中的任何内容,然后用该内存的内容覆盖该对象。如果多个任务独立地“覆盖”同一个对象,则最后一次覆盖将“赢”,并删除之前的任务。

我不知道“GAP-Projekt”是什么,但假设我们实际上在讨论GAE(根据标签),使用共享资源,GAE应用的多个实例之间相互同步是相当容易的例如memcache或GAE数据存储区。根据惯例,这些资源将用于表示“当前拥有”GCS对象的实例;另一个实例会等待...

答案 1 :(得分:2)

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

答案 2 :(得分:1)

也可以依赖 GCS preconditions

这仅允许在读取后未更改的情况下更新文件。查看文档:

<块引用>

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