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