Сделайте вызов API и операции с базой данных атомарными - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу сделать следующее:

  • Начать транзакцию
  • вставить данные в базу данных
  • После вставки отправляет данные в конечную точку API с первичный ключ вновь добавленных строк
  • Затем зафиксируйте транзакцию

Если вставка завершится неудачно, ничего не будет сделано, и все откатится. Проблема в том, что у меня нет хорошего способа откатить запрос API, если фиксация транзакции не удалась, потому что это не операция базы данных. Единственное, о чем я могу думать, это удалить данные из конечной точки. Есть ли способ лучше? Я использую структуру лица. Спасибо.

1 Ответ

1 голос
/ 07 апреля 2020

Так что, если я правильно понял, вы хотите зафиксировать БД только в том случае, если вызов API был успешным, но не можете вызвать API, пока у вас не будет сгенерированного БД первичного ключа из вставки БД.

Таким образом, это приведет к некоему двухфазному типу фиксации, но что произойдет, если вставка прошла успешно, вызов API завершился успешно, но фиксация БД завершилась неудачно? (если это произойдет!)

Поэтому, я думаю, вам следует рассмотреть вместо этого реализацию шаблона проектирования Saga.

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

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

Существуют различные способы сделать это, например, хореография. основанная сага или основанная на оркестровке сага. Вы можете найти более подробную информацию и лучшее объяснение здесь: https://microservices.io/patterns/data/saga.html

...