AWS S3客户端竞争条件解决方案

乍得·范德海

我的团队和我一直试图解决的问题涉及多个ec2实例,每个实例都具有对同一S3存储桶的独立,并行访问。当每个客户端都尝试在上述s3存储桶中下载相同文件时,该问题会作为竞争条件出现。每个客户端都尝试读取该文件,运行一些业务逻辑,然后删除该文件。由于存在很多延迟机会,因此会出现竞争状况,并且多个实例最终会运行业务逻辑。

关于工程师如何通过其s3客户端实施锁定机制的一些建议将不胜感激。

我们的头脑风暴方法:将.lock文件上载到有关哪个实例当前持有该锁的信息的s3存储桶中。当拥有锁的实例完成该过程后,它将删除其锁。(在上载锁定文件时出现问题-使用锁定机制的竞争状态)。

迈克尔·威尔斯

嗯...您现在将与锁定文件发生争用情况...多个节点将要上载相同的锁定文件!

因此,您将需要一些更复杂的功能,因为S3没有内置任何并发性,这可能非常不便。

解决此问题的明显方法是使用SQS(简单队列服务)-这是为并发而构建的。

因此,在您的情况下,所有节点都连接到同一队列,等待队列中的工作。某些东西会将元素添加到s3中需要处理的每个文件的队列中。节点之一将提取队列中的条目,处理文件,删除文件,然后删除队列中的条目。

这样一来,您就不会进行多重处理,并且可以进行优雅的缩放等。

但是,未解决的问题是首先扫描s3以便将工作放在队列中。这可能是您遇到困难的地方。

我认为您有两种选择:

  1. 使用lambda。这是相当优雅的。您可以配置一个Lambda在S3中添加内容时触发。然后,此lambda将在队列上注册一个指向文件的指针,以供ec2实例处理。

    lambda的问题在于您的应用程序分布更分散。也就是说,您不能只查看行为代码,还必须查看lambda。尽管我猜想这个lambda并不是特别重量级。

  2. 让所有ec2实例监视s3,但是当它们找到要执行的工作时,会将其添加到FIFO队列中。这是来自AWS的一种相对较新的队列类型,在该队列中,您已经保证有订单,并且只需要处理一次。因此,您可以保证即使多个节点找到了相同的s3文件,也只有一个节点可以处理该文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何关闭AWS S3客户端连接

AWS S3事件-客户端标识

访问客户端的 AWS S3 存储桶

在 AWS 中将数据从服务器发送到客户端(Web、移动设备)的解决方案?

使用客户端加密的AWS S3数据保护

使用AWS S3 Java客户端获取目录和对象元数据

AWS Lambda中的S3客户端初始化缓慢

用于连接到 s3 客户端的 aws 配置文件

在.NET Core中配置AWS S3客户端

Laravel 5 Amazon AWS S3错误:客户端错误:403 RequestTimeTooSkewed

如何将文件从AWS S3下载到客户端设备?

使用KMS的AWS S3客户端加密-区域被忽略

NodeJs:将存储在 AWS S3 上的图像提供给客户端 img 标签

为什么我们需要在 AWS S3 Java 客户端中 setReadLimit(int)

AWS CLI S3调用HeadObject操作时发生客户端错误(403):禁止

使用AWS客户端仅从单个目录复制s3文件(非递归)

React App 调用 `aws s3 sync` 将客户端本地文件夹上传到 s3

如何获取存储桶区域并将其传递给客户端o生成预签名URLS AWS S3

使用AWS S3 php客户端在JS CSS和图像上添加标头和专家mCache-Control time mdeflate

.NET中具有KMS的AWS S3客户端加密在传输的最后一部分上发出ProtocolViolationException

AWS SDK v3 代入客户端角色

预签名的AWS S3 PUT URL无法使用jquery从客户端上传

从客户端下载AWS S3文件

AWS Client VPN客户端-客户端通信

Android REST客户端:最佳解决方案?

GIT GUI客户端的远程SSH解决方案

首选的客户端路由解决方案?

无需客户端安装即可监控解决方案

AWS SES - SMTP 与 SES 客户端