AWS Lambda - сохранение состояния очереди - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время мне поручено построить безсерверную архитектуру для связи между государственными органами и гражданами, и основным компонентом является некоторая форма очереди, которая содержит некоторую форму объекта / указателя на каждый запрос граждан, отсортированную по приоритету.Государственные работники могут затем обработать элемент, когда он будет доступен.Поскольку лямбда не имеет состояния, мне нужно каким-то образом сохранить очередь снаружи.

Для сохранения состояния я понял, что вы можете использовать DynamoDB или S3 Buckets и использовать триггеры событий для вызова связанных методов Lambda.Некоторые также предлагают использовать Parameter Store для сохранения некоторых переменных состояния.Хранение вещей в глобальном масштабе также подходит, хотя, поскольку вы не можете гарантировать, что лямбда не прекратит работу, это не кажется хорошей идеей.

Наконец, я также немного прочитал о SQS, хотя понятия не имею, применимо ли это вообще к этому случаю.

Каков наилучший / рекомендуемый подход при работе с Lambda таким образом?Я склоняюсь к S3 Buckets из-за запуска событий и не использую DynamoDB в качестве нашей БД.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Также появилось глобальное хранилище вещей, хотя вы не можете гарантировать, что лямбда не прекратит работу, это не очень хорошая идея.

Правильно -- это вообще нежизнеспособно.Обратите внимание, что когда вы говорите «лямбда», вы имеете в виду процесс внутри контейнера ... и каждый раз, когда ваша лямбда-функция обрабатывает более одного вызова одновременно, вы гарантируете , что они будутне работать в одном и том же контейнере - поэтому «глобальные» переменные полезны только для оптимизации, а не для состояния.Любые два одновременных вызова одной и той же функции имеют две совершенно разные глобальные среды.

Забудем на мгновение все о лямбде - я не говорю, что не используйте лямбду;Я говорю, что то, используете ли вы Lambda, не имеет отношения к остальной части написанного ниже, - я бы сказал, что параллельные / параллельные действия в целом, возможно, являются одним из наиболее важных факторов, которые многие разработчики склонны игнорироватькогда пытаешься создать что-то похожее на то, что ты описываешь.

Чрезвычайно важно рассмотреть, как вы будете назначать работу из этой «очереди».Вы не можете просто «найти следующий элемент» и показать его работнику.

У вас должен быть способ сделать все эти вещи:

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

Не только это, но вы должны быть в состоянии сделать все эти вещи атомарно - как одно логическое действие - и без коллизий.

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

DynamoDB позволяет условные обновления - обновлять запись тогда и только тогда, когда определенное условие выполняется.Это критически важная часть функциональности, которую должно обеспечить ваше решение - например, назначить рабочий элемент x пользователю y тогда и только тогда, когда элемент x в настоящее время не назначен. Условное обновление не будет выполнено и ничего не изменится, если условие не выполняется в момент, когда происходит обновление , и в этом заключается сила функции.

S3 не поддерживает условные обновления,потому что, в отличие от DynamoDB, S3 в большинстве случаев работает только на модели конечной согласованности .После того, как объект в S3 обновлен или удален, нет гарантии, что следующий запрос к S3 вернет самую последнюю версию или что S3 не вернет элемент, который был недавно удален.Это не дефект в S3 - это оптимизация, но это делает S3 непригодным для аспекта «рабочая очередь».

Пропустите это соображение, и у вас будет система, которая работает и работает правильно.большую часть времени ... но в других случаях это "таинственно" ведет себя неправильно.

Конечно, если ваши рабочие элементы имеют сопроводительные документы (отсканированные изображения, PDF и т. д.), хранить их совершенно правильноих в S3 ... но S3 - неправильный инструмент для хранения "состояния".Хранилище параметров SSM является неправильным инструментом по той же причине - невозможно, чтобы два действия работали совместно, когда им обоим необходимо одновременно изменить «состояние».

«Триггеры событий»полезный, конечно, но из вашего описания, наиболее заметное «событие» связано не с данными или созданием рабочего элемента, а с тем, что работник говорит: «Я готов к следующему рабочему элементу».В этот момент - запускается кодом веб-сайта / приложения - когда выполняются вышеуказанные шаги, чтобы выбрать элемент и назначить его работнику.(На практике это может быть браузер → API Gateway → Lambda).Из вашего описания может не потребоваться создание нового рабочего элемента для запуска «события», или, если оно есть, оно не является самым значимым среди событий.

Для этого вам понадобится соответствующая база данных.DynamoDB, как и RDS, является кандидатом.

Очереди, предоставляемые SQS, предназначены для разделения двух частей вашего приложения - когда два процесса работают на разных скоростях, SQS используется в качестве буфера, что позволяет X безопасносохраните работу, которую необходимо выполнить, а затем продолжайте с чем-то другим, пока Y не сможет выполнить работу.Очереди SQS непрозрачны - вы не можете сами проанализировать, что находится в очереди, вы просто берете следующее сообщение и отвечаете за его обработку.На первый взгляд это, кажется, частично описывает то, что вам нужно, но не совсем подходит для этого варианта использования.Очереди ограничены в том, как долго сообщения могут быть сохранены, и как только сообщение успешно обработано, оно полностью исчезает.

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

Таким образом, SQS может иметь роль, но вам нужна авторитетная база данных для хранения работы и результатов бизнес-процесса.

0 голосов
/ 22 февраля 2019

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

очередь , которую вы описываете, является просто хранилищем данных сообщений, которые находятся в определенном состоянии.Приложение будет иметь некоторую форму бизнес-логики для определения следующего сообщения для обработки, которое может быть основано на отметке времени создания, приоритете, местоположении, категории, пользователе (например, VIP-пользователи, которые получают более быстрый ответ), специализации сотрудника, запрашивающегоследующее сообщение и т. д. Это не «очередь», а скорее вычисление для всех «неразрешенных» сообщений для определения следующего сообщения, которое нужно назначить.

Если вы хотите перейти без сервера, тогдаend, безусловно, будет использовать Lambda и базу данных (например, DynamoDB или Amazon RDS).Приложение должно хранить все в базе данных, чтобы данные были доступны для бизнес-логики приложения.Нет необходимости использовать SQS, поскольку в действительности нет «очереди», а хранилище параметров - это просто способ совместного использования параметров между компонентами приложения - он не предназначен для хранения основных данных.

Сначала определите функциональность приложения, а затем определите подходящую архитектуру, чтобы это произошло.

0 голосов
/ 21 февраля 2019

Если вам нужно сохранить сообщение, то SQS здесь не лучший инструмент, потому что тогда вашей лямбда-функции потребуется обработать сообщение и, наконец, сохранить его где-нибудь, сделав SQS только посредником.

Подход S3 дает то, что вам нужно, из коробки, учитывая, что вы можете хранить файлы (сообщения) в корзине S3, а затем использовать одну лямбду для своего события.Затем ваша лямбда обработает это событие, и файл останется в целости и сохранности на S3.

Если вам в конечном счете понадобится несколько потребителей для этого сообщения, вы можете вместо этого отправить событие S3 на SNS и, наконец, вы можете подписаться на NЛямбда-функции для заданной темы SNS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...