c# - Amazon S3 中的并发

标签 c# concurrency locking amazon-s3 distributed

我目前正在构建一个系统,其中 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/

相关文章:

sql-server - 什么样的SQL-Server锁级别适合insert?

c# - Xamarin Controller 和 xib 同一文件夹

java - Hibernate 并发在 saveOrUpdate 上创建重复记录

Python从URL高效下载图像

java - 无论如何要找出当前正在使用该对象的线程数?

c# - 如何让线程以正确的顺序运行

ruby-on-rails - Rails 中的锁/事务/隔离级别的详尽指南

c# - 在模型 .net 核心 web api 中返回具有 null 必需属性的 BadRequest

c# - 将结构从非托管 C++ 传递到 C#

c# - ASP.NET Core 5.0 MVC 中的自定义字段验证错误