Cha*_*Hey 7 java amazon-s3 race-condition
我和我的团队一直试图解决的问题涉及多个 ec2 实例,每个实例都有自己独立的并行访问同一个 S3 存储桶。当每个客户端尝试下载上述 s3 存储桶中的相同文件时,会出现竞争条件问题。每个客户端都试图读取文件,运行一些业务逻辑,然后删除文件。由于有很多延迟机会,竞争条件发生并且多个实例最终运行业务逻辑。
关于工程师如何使用他们的 s3 客户端实现锁定机制的一些建议将不胜感激。
我们集思广益的方法:将 .lock 文件上传到 s3 存储桶,其中包含有关当前持有锁的实例的信息。当持有锁的实例完成进程时,它就会删除它的锁。(上传锁定文件时会出现问题 - 锁定机制的竞争条件)。
嗯...现在锁文件将出现竞争条件...多个节点将上传相同的锁文件!
因此,您需要一些更复杂的东西,因为 S3 没有内置任何并发性,这可能非常不方便。
处理这个问题的明显方法是使用 SQS(简单队列服务)——这是为并发性而构建的。
因此,在您的情况下,所有节点都连接到同一个队列,等待队列中的工作。某些东西会将元素添加到 s3 中需要处理的每个文件的队列中。其中一个节点将拾取队列中的条目、处理文件、删除文件并删除队列中的条目。
这样你就不会得到多重处理,并且得到优雅的缩放等。
然而,突出的问题是首先扫描 s3 以将工作放入队列的是什么。这可能就是您遇到困难的地方。
我认为你有两个选择:
使用 lambda。这是相当优雅的。您可以将 lambda 配置为在将某些内容添加到 S3 时触发。然后,该 lambda 将注册一个指向队列上的文件的指针,以供 ec2 实例进行处理。
lambda 的问题是您的应用程序更加分布式。也就是说,你不能只在代码中查找行为,你还必须查看 lambda。虽然我猜这个 lambda 并不是特别重量级。
让所有 ec2 实例监控 s3,但当它们找到工作要做时,它们会将工作添加到 FIFO 队列中。这是 AWS 中相对较新的队列类型,您可以保证顺序并且只处理一次。这样你就可以保证即使多个节点发现了同一个 s3 文件,也只有一个节点会处理它。
| 归档时间: |
|
| 查看次数: |
6403 次 |
| 最近记录: |