⬆️Начало выше⬆️



Версионирование состояния



Сервер отслеживает версии состояния ресурса и позволяет клиенту указывать, для какой версии предназначен запрос. Если состояние изменилось, сервер отклоняет запрос. Версия может быть как числом (номером последнего изменения), так и хэшом от списка ресурсов.



Как это работает на примере сервиса заказа такси:



Вводные

💩Каждый раз, когда в системе происходит изменение (создание, отмена, редактирование заказа), сервер увеличивает версию списка заказов. Эта версия отражает все изменения, произошедшие с заказами пользователя.

💩Перед созданием нового заказа приложение запрашивает у сервера текущую версию списка заказов через GET /v1/orders.



Процесс

1️⃣При создании заказа приложение включает в запрос заголовок If-Match с версией, которую оно знает.

2️⃣Сервер проверяет, соответствует ли версия в запросе текущему состоянию списка заказов. Если версия не совпадает, сервер отклоняет запрос, предотвращая создание дубликата.

3️⃣Если состояние заказов изменилось (например, заказ был отменен), сервер сообщает об этом приложению, отправляя ошибку с предложением перезагрузить информацию о заказах через GET /v1/orders.





Идемпотентность удаления



HTTP-метод удаления DELETE по своей природе идемпотентный, так как повторное удаление уже удаленного ресурса не изменяет состояние системы. После первого успешного все последующие запросы на удаление будут возвращать ошибку 404 (или другой код согласно логике сервера).



Более гибкий способ обеспечить идемпотентность удаления – использовать подход “Soft Delete”. Вместо физического удаления записи из базы данных, запись просто помечается как удаленная с помощью специального флага.



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



📎 Статьи



1. Стажёр Вася и его истории об идемпотентности API — очень рекомендуем

2. Кратко об идемпотентности от Yandex Cloud

3. Идемпотентность: больше, чем кажется

4. Идемпотентность при использовании API Mindbox

5. Что такое ключ идемпотентности и зачем он нужен

6. Семантика exactly-once в Apache Kafka



Видео

1. Что такое идемпотентность, или история Васи и его приложения

2. Идемпотентность и коммутативность API в очередях и HTTP // Демо-занятие курса «Software Architect»

3. Идемпотентность: что, где и как

4. Микросервисы: идемпотентность операций



#api #проектирование