Самый примитивный способ, который выдерживает разветвление событий: замкнуть все микросервисы на одну шину данных(очередь сообщений), заставить поддерживать отмену сделанной операции и заставить выдерживать дубли обращений. При старте многофазной операции создается идентификатор операции, который проходит сквозь все сервисы (ключ идемпотентности), по которому предотвращается дублирование и делается откат операций. Причем этот ключ можно прогнать даже через платежную систему.
Теперь представьте магию. Вы создаете заказ, который приводит к множеству параллельных, последовательных и очень сложно-разветвленных задач (резервирование на складе, отправка уведомлений, списание средств ит.п), в глубине которых что-то обламывается. Поскольку сервисы изолированы и почти ничего не знают друг о друге, надо всех причастных заставить вернуть "как было" через общий канал. Обломавшийся микросервис, зная ключ операции, кидает в шину сообщение "операция (id) не удалась, без подробностей". Далее все микросервисы: 1) откатывают операцию по id, если уже сделали 2) перестают реагировать на такой id, если еще не дошли запросы.
Итого: система вернулась в первоначальное состояние в целостном виде.
За все надо платить: на каждую операцию обязательно тесты и двойная работа по добавлению обратных операций, иногда нетривиальной логики (например, в части отправки сообщений). Если что-то пошло не так, должны быть очень качественные логи - отладчиком такое не пройти.