Как выполнить откат на микросервисе, когда некоторые HTTP-запросы выполнены успешно, а некоторые HTTP-запросы не выполнены с помощью jdbcTemplate

У меня есть проекты весенней загрузки, построенные на микросервисе, и я использую KONG в качестве API-шлюза. Все службы находятся в контейнере Docker.

В моей ситуации я использую цикл serviceA 20 раз, чтобы запросить удаление записей в serviceB с помощью jdbcTemplate. Первые 10 запросов успешны. Итак, 10 записей удаляются из базы данных postgresql в serviceB. Но 11-й запрос - ошибка. Поэтому я хотел бы откатить все 10 записей, которые были успешно удалены из базы данных.

У меня вопрос, могу ли я в такой ситуации откатиться? Если есть возможность отката, как это сделать? и какую технологию мне следует использовать? Могу ли я использовать Spring Cloud Stream и Kafka в этой ситуации для отката?


person Soumpanhaoudom    schedule 05.11.2018    source источник
comment
Нет, вы не можете откатиться, вы можете откатиться только в том случае, если все будет в одной транзакции. Поэтому вам нужно компенсировать это самостоятельно, возможно, вручную восстановив записи или не зациклившись, но сделав возможность удалить все за один раз.   -  person M. Deinum    schedule 05.11.2018
comment
Спасибо за вашу поддержку.   -  person Soumpanhaoudom    schedule 05.11.2018


Ответы (1)


Один из вариантов - использовать распределенные транзакции, что довольно сложно ...

Кроме того, вы можете изменить архитектуру, что тоже не лучший совет.

Собираюсь к некоторым реальным советам.

Общий вопрос здесь в том, является ли это единственным проблемным случаем. Если да - это довольно просто - расширьте свой API таким образом, чтобы разрешить множественное удаление за одну операцию. См. API Oracle / Scim. Таким образом, изменение отдельной группы атомарно. Проблема начинается, когда кто-то хочет переместить пользователя из одной группы в другую. Так что, может быть, вы сможете справиться с проблемными случаями, добавив специальный метод - например, представленный patch?

Остальное, потом все это. Вы можете использовать command шаблон проектирования и возвращаться для каждой операции. Это все еще сложно, поскольку не все откаты возможны, но это сильно зависит от вашего случая.

ОБНОВИТЬ

Есть что-то вроде паттерна саги. Для определенных операций подготовлена ​​операция возврата. И есть менеджер, который знает, что пошло не так и какие требуются откаты. Вот для этого статья. Иногда это срабатывает, но ... реверсирование - это действительно проблематичная операция - например, отправка электронной почты. :)

person Michał Zaborowski    schedule 05.11.2018