Yrl*_*lec 10 c# concurrency distributed locking amazon-s3
我目前正在构建一个系统,其中S3将被Internet上的许多计算机用作持久性哈希集(S3 URL是从数据中推断出来的).如果两个节点存储相同的数据,那么它将使用相同的密钥存储,因此不会存储两次.当一个对象被删除时,我需要知道其他一些节点是否也在使用该数据.在那种情况下,我不会删除它.
现在我通过添加一个存储节点列表作为写入S3的数据的一部分来实现它.因此,当节点存储数据时,会发生以下情况:
这创建了一种幂等引用计数的形式.由于通过Internet的请求可能非常不可靠,我不想只计算存储节点的数量.这就是我存储列表而不是计数器的原因(如果节点发送相同的请求> 1次).
只要两个节点不同时写入,此方法就可以工作.S3(据我所知)并没有提供任何方法来锁定对象,以便所有这5个步骤都成为原子.
你会如何解决这个并发问题?我正在考虑实现某种形式的乐观并发.我该如何为S3做到这一点?我应该使用完全不同的方法吗?
首先考虑将锁定列表与(受保护的)数据分开。创建一个特定于您的数据的单独存储桶以包含锁定列表(存储桶名称应该是您的数据对象名称的派生词)。使用第二个存储桶中的单个文件(每个节点一个,对象名称源自节点名称)。节点在访问受保护的数据之前将新对象添加到第二个存储桶中,节点在完成后从第二个存储桶中删除其对象。
这允许您枚举第二个存储桶以确定您的数据是否被锁定。并且允许两个节点同时更新锁列表而不会发生冲突。