首页 > 解决方案 > 尝试使用 AWS s3.put_object 创建一个相同的空文件,由多个进程并行使用 python

问题描述

假设如果两个(可以是任意数量)进程试图并行访问相同的代码块,为了避免并行访问,我试图在 s3 存储桶中创建一个空文件,这样如果该文件存在,那么其他进程在第一个进程结束使用代码块之前,它试图访问必须等待。使用后,第一个进程将删除空文件,这意味着第二个进程现在可以通过创建空文件并持有锁来使用该代码块。

import boto3
s3 = boto3.client('s3')
def create_obj(bucket, file):      
    s3.put_object(Bucket=bucket, Key=file)
    return "file created"

job1 = create_obj(bucket="s3bucketname", file='xyz/empty_file.txt')
job2 = create_obj(bucket="s3bucketname", file='xyz/empty_file.txt')

这里假设 job1 和 job2 正在尝试并行访问相同的 create_obj 以创建 create empty_file.txt,这意味着它们同时打线s3.put_object。然后其中一项工作必须等待。这里 n 个作业可以create_obj并行访问该功能。我们需要确保这些作业如上文所述正确执行。

请帮我解决一下这个。

标签: pythonamazon-s3boto3

解决方案


我的理解是你试图在S3的基础上实现分布式锁定机制。

由于在 re:invent 2020 上更新了 S3 一致性模型,这可能是可能的,但您也可以使用 DynamoDB 之类的服务,这样可以更轻松地构建这些模型。

我建议您查看AWS 博客上的这篇博文,其中描述了该过程由于此处不鼓励仅提供链接的答案,因此我将尝试总结这个想法,但您真的应该阅读完整的文章。

  1. PutItem对表中的锁定项进行条件调用。条件是,具有该密钥的项目不存在或已过期。新项目包含:
    • 锁的名称(分区键)
    • 该锁应该有效多长时间
    • 创建锁的时间戳
    • 一些标识您的系统的标识符(锁定实体)
  2. 如果 put 有效,您就知道您已经获得了锁,如果失败,您就知道它已经被锁定,可以稍后重试
  3. 然后你执行你的工作
  4. 最后你删除了锁定项目

有一个 Python 的实现以及PyPi 上的 python-dynamodb-lock


推荐阅读