【问题标题】:Can I use S3 as a shared, standalone, work queue?我可以将 S3 用作共享的独立工作队列吗?
【发布时间】:2021-10-05 07:12:30
【问题描述】:

我在 S3 存储桶中有一组文件,我希望多个客户端通过下载和删除文件来处理这些文件,以便在本地处理它们。

如何确保只有一个客户端可以访问任何单个文件,以便只有一个工作人员下载并处理它?我知道我可以引入一个额外的队列系统或其他外部进程来实现某种 FIFO 队列或锁定机制,但我真的希望在这里尽量减少组件的数量,所以它很简单

(file_generation -> S3 -> workers) 无需添加更多系统来管理或可能破坏的东西。

那么有没有办法获得一个文件的锁或以某种方式为单个工作人员自动标记它,以便其他工作人员知道忽略它?也许用工作人员的 ID 重命名对象的键,以便“认领”并且没有其他人会碰它?

【问题讨论】:

    标签: c# amazon-web-services amazon-s3 queue


    【解决方案1】:

    为什么要使用像队列这样的文件存储?为什么不使用队列? (从你的问题来看,你好像很懒!)。

    如果您想保持类似的工作流程,请在 S3 上创建一个文件并将该文件的 URI 发布到队列中(这可以由 AWS 自动完成)。

    队列可以有多个消费者,并且永远不会有任何冲突(通常)。

    【讨论】:

    • 因为文件可能很大并且进程已经在使用 S3,所以引入另一个组件来管理队列只会增加我试图避免的复杂性。不过谢谢你侮辱我!
    • 你想做的那个“锁定”的事情,很难做到吗?这就是队列简化事情的地方。不需要任何复杂的东西。读取队列很容易。
    • 我明白了,但我希望能够简单地将文件放入存储桶中,并由单个工作人员拾取和处理,而不必添加到单独的队列中。它会产生一些问题,例如如果队列中的条目丢失并且文件仍然存在,或者文件需要重新排队,或者队列脱机,或者对象被重命名等。如果我可以从 s3 原子地获取和删除文件,我所有的忧虑将得到解决,桶将成为“工作项”的最终来源。
    【解决方案2】:

    如何确保只有一个客户端可以访问任何单个文件,以便只有一个工作人员下载并处理它?

    通过使用队列,例如 Amazon SQS 队列:

    • 创建 SQS 队列
    • 将 S3 存储桶配置为在创建新对象时自动向队列发送消息
    • 将您的工作人员配置为轮询 SQS 队列以获取消息。
    • 当他们收到消息时,该消息会暂时“不可见”,但不会从队列中删除
    • 当工作人员完成他们的进程时,他们会从 SQS 队列中删除消息

    它 100% 满足您的要求,并且“开箱即用”。比编写自己的流程可靠得多。

    如果队列中的条目丢失并且文件仍然存在怎么办

    Amazon SQS 在处理消息但未完全处理时支持不可见期的概念。如果一个工作人员在处理后未能删除消息,则该消息将在定义的时间后重新出现在队列中,准备好让另一个工作人员处理它。

    或者队列离线

    Amazon SQS 是一项区域服务,这意味着队列在多个可用区之间复制,由并行服务器操作。

    或者对象被重命名

    无法在 Amazon S3 中“重命名”对象。需要复制对象并删除原始对象。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2017-08-11
      • 1970-01-01
      • 2015-06-14
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多