У меня есть список рабочих функций Lambda (скажем 1000), каждый из которых работает одновременно и выполняет свою работу. Чтобы понять конечный результат всех работников, я придумал эту идею.Amazon DynamoDB Atomic Writes
Перед началом работы и нерест функции работника лямбда, я сохранить запись в DynamoDB, например, два атрибута:
total_number_of_jobs
jobs_completed
(набор первоначально 0)
По завершении каждой рабочей функции Lambda она будет идти и увеличивать атрибут jobs_completed
на один. Затем прочитайте запись и проверьте, соответствует ли total_number_of_jobs
jobs_completed
, и если да, поместите запись в SQS.
Мои вопросы:
- Является ли это хорошая идея?
- Могут ли обновления быть последовательными и атомными? Могут ли быть какие-либо условия гонки?
- Любое лучшее решение, чем это?
Я обновляю счетчик, jobs_completed
, в API вызова UpdateItem, как это:
SET jobs_completed = jobs_completed + :incr_by
где incr_by
будет равна 1
.
Что вы подразумеваете под «проверять возвращаемое значение вызова UpdateItem вместо запуска отдельного запроса». Вы можете объяснить? –
Установите атрибут 'ReturnValues' в вызове' UpdateItem' '' ALL_NEW '' или, возможно, '' UPDATED_NEW''. Тогда ответ от вызова «UpdateItem» будет содержать обновленный элемент с новым значением «jobs_completed», которое вы можете сравнить с значением «total_number_of_jobs», чтобы определить, было ли последнее обновление, которое вы только что выполнили, последним. Вы хотите сделать это вместо выполнения вызова «GetItem» после вызова «UpdateItem». –
Понятно, теперь я понимаю. Но даже если я выполняю отдельный запрос GetItem или Query, не должен ли я получать одно и то же значение, учитывая, что я выполняю строго последовательный вызов? –