Я искал способ спроектировать мой API, чтобы он был идемпотентным, то есть что-то из этого, чтобы сделать мои маршруты POST-запросов идемпотентными, и я наткнулся на эту статью .
(Если я понял что-то не так, пожалуйста, поправьте меня!)
В этом есть хорошее объяснение общей идеи. но не хватает некоторых примеров того, как он сам это реализовал.
Кто-то спросил автора статьи, как он может гарантировать атомарность? поэтому автор добавил пример кода.
По существу, в его примере кода есть два случая,
поток, если все идет хорошо:
- Открыть транзакцию в БД, которая содержит данные, которые необходимо изменить с помощью запроса POST
- Внутри этой транзакции выполните необходимое изменение
- Установите ключ
Idempotency-key
и значение, который является ответом для клиента, внутри хранилища Redis - Установите время истечения для этого ключа
- Передайте транзакцию
поток, если что-то внутри кодаидет не так:
- и происходит исключение внутри потока функции.
- выполняется откат к транзакции
Обратите внимание, что транзакция являетсяоткрыт для определенной БД, давайте назовем его А. Однако это не относится к хранилищу redis, которое он также использует, а это означает, что откат транзакции затронет только БД А.
Таким образом, он охватываетслучай когда что-то радуетзаканчивается внутри кода, который делает невозможным завершение транзакции.
Но что произойдет, если машина, на которой выполняется код, вылетит, пока она находится в состоянии, когда она уже выполнила Set expire time to that key
и теперь он собирается выполнить фиксацию транзакции?
В этом случае ключ будет доступен в хранилище redis, но транзакция не была зафиксирована. Это приведет к ситуации, когда служба уверена, что необходимые изменения уже произошли, но это не так, машина вышла из строя до того, как она может ее завершить.
Мне нужно спроектировать API таким способомчто если изменение в данных или настройке ключа и значения в redis не удастся, то они оба откатятся.
Каково решение этой проблемы?
Как я могу гарантироватьатомарность изменения необходимых данных в одной базе данных, и в то же время установка ключа и необходимого ответа в redis, и если какой-либо из них не удается, откатить их обоих? (Включая случай, когда во время действий происходит сбой машины)
Пожалуйста, добавьте пример кода при ответе! Я использую те же технологии, что и в статье (nodejs,Redis, Монго - для самих данных)
Спасибо:)