【问题标题】:How to track distributed tasks progress如何跟踪分布式任务的进度
【发布时间】:2018-06-27 07:49:55
【问题描述】:

这是我的情况:

  1. 当我的服务器收到请求时,它会触发分布式任务,在我的例子中是许多 AWS lambda 函数(peek 值可能是 3000)
  2. 我需要跟踪每个任务的进度/状态,即挂起、运行、成功、错误
  3. 我的服务器可能有很多副本
  4. 即使我的任何服务器副本关闭,我仍然想了解任务进度/状态

我目前的设计:

  1. 我选择 AWS S3 作为我的助手
  2. 当任务开始执行时,它会在 S3 上的一个特殊文件夹中创建标记文件,例如正在运行文件夹
  3. 当任务失败或成功时,它会将标记文件从running文件夹移动到fail文件夹或success文件夹
  4. 我检查 S3 上的标记文件以检查任务的进度。

问题:

  1. AWS S3 并发访问有限制
  2. 我的案子总有一天会超过限额

尝试解决方案:

  1. 我已尽力减少对 S3 的请求数
  2. 我不想通过在我的数据库中存储数据来跟踪进度,因为我的数据库已经承受着繁重的工作量。

说实话,在 S3 上使用标记文件来跟踪任务的进度有点奇怪。但是,它以前工作过。

有什么建议吗?

提前致谢!

【问题讨论】:

    标签: amazon-web-services amazon-s3 architecture distributed-system


    【解决方案1】:

    这听起来像是持久事件队列的完美应用,特别是 Kinesis。当每个 Lambda 启动时,它会在 Kinesis 上生成一个“启动”事件。当它成功或失败时,它会生成相应的事件。如果您想查看进展情况,您甚至可以在此过程中创建进度事件。

    然后,您的服务器可以根据结束事件(成功或失败)监控开始事件的数量,直到这两个数字相等。它可以查询错误事件以查看哪些进程失败以及失败的原因。所有服务器都可以查询相同的事件而不会相互中断,任何服务器都可以在不丢失数据的情况下停机和恢复。

    确保在应该组合在一起的事件上放置一个 Origination Key,以免它们与后续事件混淆。此外,每个 Lambda 都应该有自己的密钥,以便您可以跟踪每个 Lambda 的进度。指南非常适合这一点。

    【讨论】:

    • 您好,我有一个关于您的解决方案的问题。如果我的服务器重新启动,我如何跟踪以前任务的进度?我的理解是,持久事件队列成功传递一个事件后,它会删除它,所以我不能再查询同一个事件了。
    • 常规队列(RabbitMQ、AWS SQS 或 Azure 队列服务)将在确认消息已处理后删除消息。持久队列(Kafka、AWS Kinesis 或 Azure Event Hub)在用户定义的时间段内维护消息。 Kinesis 的默认值为 7 天,但可以延长,但需支付额外费用。所有这 3 个服务都允许检索未读消息,或自某个时间点以来已读和未读消息。这允许在必要时重新处理消息,或者多个服务器处理相同的消息。
    • 顺便说一句,我所说的“持久队列”更正式地称为流数据系统。我不应该使用“持久队列”这个术语,因为在谈论排队系统时它的含义有所不同。
    猜你喜欢
    • 2013-02-14
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多