Использование AWS пошаговых функций и SQS с масштабированием рабочих узлов - PullRequest
0 голосов
/ 05 февраля 2020

Итак, я пытаюсь выяснить, как я могу заставить пошаговые функции работать так, чтобы они могли делегировать задачу любому из неопределенного числа идентичных рабочих узлов. Кроме того, в идеале мне нужна структура очереди перед рабочими узлами. В основном, глядя на SQS прямо сейчас.

Я начал с того, что подумал, что я просто скопирую sh сообщений от пошаговых функций в очередь FIFO, а затем проведу длинный опрос работников в очереди. Предоставляя каждому сообщению уникальный messageGroupId, каждый работник извлекает сообщение и обрабатывает задание, не блокируя другие рабочие узлы от извлечения новых заданий из очереди.

Однако моя проблема с этим заключается в том, что мне кажется, что я пропускаю основное преимущество Step Functions - видимость в конвейере. Шаговые функции не будут знать, когда сообщение удаляется из очереди и начинается работа с ним; он ничего не слышит, пока работник не отправит уведомление об успехе или неудаче. Таким образом, нет возможности видеть время, проведенное в очереди, по сравнению с временем, потраченным на обработку.

Но если я хочу увидеть рабочий процесс, это означает, что рабочему этапу нужно свое собственное состояние. И если ему нужно собственное состояние в конвейере, это означает, что ему нужен собственный ресурс. Но ... если я динамически создаю рабочих, это означает, что мне нужно также динамически создавать действия и выполнять задачу arn dynamici c. Но, насколько я могу судить, это невозможно.

Я экспериментировал с прослушивателем, который создавал бы свою собственную активность при запуске - на которую фактический работник немедленно подписывался бы - затем слушал очередь. Когда слушатель получает сообщение, он немедленно отправляет задание успешно, с выводом, который включает ARN его личной активности. В идеале вы сможете проанализировать входные данные и создать состояние, подобное:

{
    ...
    "Do Work": {
          "Type": "Task",
          "Resource.$": "$.activityArn",
          "Next": "Notify Success"
    }
    "Notify Success": {...}
}

Для того, чтобы отправить задание заданному действию, чтобы оно было подобрано соответствующим работником. Однако Resource не поддерживает jsonpath на входе, поэтому он не компилируется.

Итак, есть ли способ назначить работу идентичным рабочим узлам, которые автоматически масштабируются, так что у меня все еще есть видимость работы, которую они выполняют?

Редактировать: Еще одна потенциальная причина хотеть отделиться Очередь от работника в пошаговых функциях будет включать тайм-аут задачи, который может быть задержан из-за пульса работника. Если очередь и работник - это все одна задача, то сообщение может оказаться в очереди слишком долго и вызвать тайм-аут, поскольку очередь не отправляет ответы пульса (я думаю, что это так или иначе будет работать).

...