Amazon S3中的并发性

Yrl*_*lec 10 c# concurrency distributed locking amazon-s3

我目前正在构建一个系统,其中S3将被Internet上的许多计算机用作持久性哈希集(S3 URL是从数据中推断出来的).如果两个节点存储相同的数据,那么它将使用相同的密钥存储,因此不会存储两次.当一个对象被删除时,我需要知道其他一些节点是否也在使用该数据.在那种情况下,我不会删除它.

现在我通过添加一个存储节点列表作为写入S3的数据的一部分来实现它.因此,当节点存储数据时,会发生以下情况:

  1. 从S3读取对象.
  2. 反序列化对象.
  3. 将新节点的id添加到存储节点列表中.
  4. 序列化新对象(要存储的数据和节点列表).
  5. 将序列化数据写入S3.

这创建了一种幂等引用计数的形式.由于通过Internet的请求可能非常不可靠,我不想只计算存储节点的数量.这就是我存储列表而不是计数器的原因(如果节点发送相同的请求> 1次).

只要两个节点不同时写入,此方法就可以工作.S3(据我所知)并没有提供任何方法来锁定对象,以便所有这5个步骤都成为原子.

你会如何解决这个并发问题?我正在考虑实现某种形式的乐观并发.我该如何为S3做到这一点?我应该使用完全不同的方法吗?

Tai*_*ils 4

首先考虑将锁定列表与(受保护的)数据分开。创建一个特定于您的数据的单独存储桶以包含锁定列表(存储桶名称应该是您的数据对象名称的派生词)。使用第二个存储桶中的单个文件(每个节点一个,对象名称源自节点名称)。节点在访问受保护的数据之前将新对象添加到第二个存储桶中,节点在完成后从第二个存储桶中删除其对象。

这允许您枚举第二个存储桶以确定您的数据是否被锁定。并且允许两个节点同时更新锁列表而不会发生冲突。