gpt4 book ai didi

c# - Amazon S3 中的并发

转载 作者:可可西里 更新时间:2023-11-01 09:07:42 25 4
gpt4 key购买 nike

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

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

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

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

只要两个节点不同时写入,这种方法就有效。 S3 不(据我所知)提供任何方法来锁定对象,以便所有这 5 个步骤成为原子。

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

最佳答案

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

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

关于c# - Amazon S3 中的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com