无法提出简单的解决方案,只能探索几个方向。
首先,Step Functions 有一种特定的方式来处理长时间运行的后台工作:活动。 https://docs.aws.amazon.com/step-functions/latest/dg/concepts-activities.html 基本上就是一个队列。
如果您想要 100% 无服务器,这将变得复杂或丑陋。
- 如您所说,为每个文件创建新的步进函数
- 或者,状态机中的 S3 轮询循环使用自定义错误代码和
Retry 子句
如果您可以为后台工作人员分配“1/8 微”实例,它并不优雅但很容易,并且可以通过即时反应来实现。低硬件要求暗示我们将只使用机器进行同步。
定义 StepFunction 活动,例如命名为 video-duration。
定义 SQS 队列以进行即时反应或轮询 S3 以获取持续时间结果。
状态函数伪代码:
{
StartAt: ffprobe
ffprobe: {
Type: Task
Resource: arn:...lambda:launch-ffprobe
Next: wait-duration
}
wait-duration: {
Type: Task
Resource: arn...activity:video-duration
End: true
}
}
后台工作人员伪代码:
statemap = dict/map filename to result
thread1:
loop:
taskToken, input = SF.GetActivityTask('video-duration') # long poll
sync(key=input.filename, waiter=taskToken)
thread2:
loop:
msg = SQS.ReceiveMessage(...) # or poll S3
sync(key=msg.filename, duration=msg.result)
function sync(key, waiter, duration):
state = statemap[key]
if waiter:
state.waiter = waiter
if duration:
state.duration = duration
if state.waiter and state.duration:
SF.SendTaskSuccess(state.waiter, state.duration)
S3 触发伪代码:
if filename is video:
SF.StartExecution(...)
else if filename is duration:
content = S3.GetObject(filename)
SQS.SendMessage(queue, content)