
Originally Posted by
GPS
What Oleg has mentioned is correct. We struggled with same problem as you (with only difference being, we didn't have to deal with legacy systems). We wrote a central Orchestrator layer, which would interact with several components for a request (a typical high value payment flow end to end, where you need to reduce User's daily limits - system 1, apply approvals - system 2, submit payment to downstream system for further processing - system 3, do Audits - system 4 etc). Anything failing (except Audits) had to be rolled back, so essentially every system provided an interface to rollback the previous action. We used SI's Splitter - Aggregator pattern. Every system is supposed to reply back with some unique identifier, and a success / failure indicator.
In Aggregator, failure from any system would result in another flow being started, to again call individual systems to rollback based on the unique Ids. If all is successful, using the same flow, send confirmation to all systems to commit based on unique Ids.
This might not be what you are looking for (its hard dealing with legacy systems), but this is what we could go closest. I would interested to hear any alternatives.