Проектирование Функций Azure для идентичных входных данных

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

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

Нажатие кнопки вызова лифта во второй, третий или четвертый раз никак не повлияет на окончательный результат. При нажатии кнопки, независимо от количества раз, лифт отправляется на ваш этаж. Идемпотентные системы, такие как лифт, выдают одинаковый результат независимо от того, сколько раз подаются идентичные команды.

Когда дело доходит до создания приложений, учитывайте следующие сценарии.

  • Что произойдет, если приложение управления запасами попытается удалить один и тот же продукт несколько раз?
  • Как поведет себя приложение управления персоналом, если поступит несколько запросов на создание записи сотрудника для одного и того же человека?
  • Куда уйдут деньги, если банковское приложение получит 100 запросов на одно и то же снятие средств?

Существует множество контекстов, в которых запросы к функции могут получать идентичные команды. Возможны следующие ситуации:

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

Для защиты целостности данных и работоспособности системы идемпотентное приложение включает логику, которая может содержать следующие варианты поведения:

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

В конечном итоге идемпотентность достигается путем обеспечения возможности определенного действия и однократности его выполнения.