Допустим, у нас есть веб-служба, которая создает и обновляет бронирование конференц-залов. Обновления могут изменить различные аспекты бронирования, такие как время и номер комнаты.
Давайте представим, что сетевое подключение пользователя к сервису может быть ненадежным (например, мобильная сеть), и два пользователя А и Б пытаются последовательно обновить одно и то же бронирование.
Пользователь A отправляет запрос POST, чтобы изменить время встречи на 14:00, запрос достигает сервера, и сервер успешно обработал запрос. Однако ответ пользователю А теряется из-за сетевого подключения, и пользователь А считает, что запрос не выполнен.
Прежде чем пользователь A попытается снова, пользователь B отправляет свой запрос на изменение времени встречи на 14:30, и он успешно отвечает пользователю B.
Теперь пользователь А повторяет (возможно, автоматически) тот же запрос снова, и на этот раз и запрос, и ответ выполняются без проблем. Другими словами, время встречи снова переносится на 14:00.
В приведенном выше гипотетическом сценарии дублированные запросы пользователя А приводят к тому, что запрос пользователя Б перезаписывается, что приводит к неправильному состоянию на стороне сервера.
Одним из возможных, но наивных решений является установка идентификатора для каждого запроса на клиенте, и этот идентификатор не изменяется, если запрос просто повторяется/повторно отправляется. Затем на стороне сервера сервер поддерживает коллекцию полученных идентификаторов запросов и проверяет наличие дубликатов.
Каковы лучшие методы или методы для решения этой проблемы?