Невозможно предложить простое решение, только несколько направлений для изучения.
Во-первых, функции Step имеют особый способ обработки долгого рабочего фона: действия. https://docs.aws.amazon.com/step-functions/latest/dg/concepts-activities.html Это в основном очередь.
Если вы хотите 100% -ный сервер без сервера, это будет сложно или уродливо.
- либо, как вы сказали, создать новую ступенчатую функцию для каждого файла
- или, S3 цикла опроса в государственной машине, используя пользовательский код ошибки и
Retry
пункт
Если вы можете выделить «1/8 micro "для фонового работника это не изящно, но легко и может быть реализовано с мгновенной реакцией. Низкое требование к оборудованию подсказывает, что мы будем использовать машину только для синхронизации.
Определить деятельность 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)