2016-01-07 3 views
1

У меня есть список рабочих функций Lambda (скажем 1000), каждый из которых работает одновременно и выполняет свою работу. Чтобы понять конечный результат всех работников, я придумал эту идею.Amazon DynamoDB Atomic Writes

Перед началом работы и нерест функции работника лямбда, я сохранить запись в DynamoDB, например, два атрибута:

  • total_number_of_jobs
  • jobs_completed (набор первоначально 0)

По завершении каждой рабочей функции Lambda она будет идти и увеличивать атрибут jobs_completed на один. Затем прочитайте запись и проверьте, соответствует ли total_number_of_jobsjobs_completed, и если да, поместите запись в SQS.

Мои вопросы:

  1. Является ли это хорошая идея?
  2. Могут ли обновления быть последовательными и атомными? Могут ли быть какие-либо условия гонки?
  3. Любое лучшее решение, чем это?

Я обновляю счетчик, jobs_completed, в API вызова UpdateItem, как это:

SET jobs_completed = jobs_completed + :incr_by где incr_by будет равна 1.

ответ

2

Пока вы используете атомные счетчики DynamoDB, как показано на примере, и вы проверяете возвращаемое значение вызова UpdateItem вместо запуска отдельного запроса, ваше предлагаемое решение должно работать нормально.

+0

Что вы подразумеваете под «проверять возвращаемое значение вызова UpdateItem вместо запуска отдельного запроса». Вы можете объяснить? –

+1

Установите атрибут 'ReturnValues' в вызове' UpdateItem' '' ALL_NEW '' или, возможно, '' UPDATED_NEW''. Тогда ответ от вызова «UpdateItem» будет содержать обновленный элемент с новым значением «jobs_completed», которое вы можете сравнить с значением «total_number_of_jobs», чтобы определить, было ли последнее обновление, которое вы только что выполнили, последним. Вы хотите сделать это вместо выполнения вызова «GetItem» после вызова «UpdateItem». –

+0

Понятно, теперь я понимаю. Но даже если я выполняю отдельный запрос GetItem или Query, не должен ли я получать одно и то же значение, учитывая, что я выполняю строго последовательный вызов? –