【发布时间】:2011-06-08 09:27:37
【问题描述】:
我目前正在构建一个系统,其中 S3 将被 Internet 上的许多计算机用作持久哈希集(S3 URL 是从数据中推断出来的)。如果两个节点存储相同的数据,那么它将使用相同的密钥存储,因此不会存储两次。当一个对象被删除时,我需要知道其他节点是否也在使用该数据。在这种情况下,我不会删除它。
现在我通过添加存储节点列表作为写入 S3 的数据的一部分来实现它。因此,当节点存储数据时,会发生以下情况:
- 从 S3 读取对象。
- 反序列化对象。
- 将新节点的 id 添加到存储节点列表中。
- 序列化新对象(要存储的数据和节点列表)。
- 将序列化数据写入 S3。
这创建了一种幂等引用计数。由于 Internet 上的请求可能非常不可靠,我不想只计算存储节点的数量。这就是为什么我要存储一个列表而不是一个计数器(如果一个节点发送相同的请求 >1 次)。
只要两个节点不同时写入,这种方法就可以工作。 S3 没有(据我所知)提供任何锁定对象的方法,以便所有这 5 个步骤都成为原子的。
您将如何解决这个并发问题?我正在考虑实施某种形式的乐观并发。我应该如何为 S3 做到这一点?我是否应该使用完全不同的方法?
【问题讨论】:
标签: c# concurrency locking amazon-s3 distributed