After look into SCB-163, SCB-1385 and SCB-1386 I have some thoughts on Saga involved in async invocation. Current implementation is basically based on sync invocation, there are some assumption:
1. When @SagaStart method returns, the Saga finished. 2. When @Compensable method returns/throws exception, the Local Tx succeeds/failed. 3. When compensationMethod returns, the Local Tx is compensated. Even if considering what SCB-100 provided: 1. Add @OmegaContextAware annotation enabling java.util.concurrent.Executor inject OmegaConext into threads it manages/spawns 2. Make OmegaContext use InheritableThreadLocal field let child thread inherit parent thread's Local Tx info There are still some limitations: 1. @OmegaContextAware is only viable if you use spring framework 2. @OmegaContextAware and OmegaContext's InheritableThreadLocal field assuming that the calling thread or initator thread has Local Tx info. What if user code use producer-consumer pattern in which InheritableThreadLocal can't work? What if user code use a thread scheduling library which we cannot use @OmegaContextAware,RxJava and Reactor, for example? I think we could provide some low-level APIs that user code can manualy starts/ends Saga and Local Tx, something like below: TxContext context = omega.startSaga(); TxContext subTxContext = omega.startTx(TxContext parentTxContext); omega.endTx(TxContext); omega.abortTx(TxContext); omega.abortSaga(TxContext); omega.endSaga(TxContext); TxContext is just a immutable dto like this: public class TxContext { private final String globalTxId; private final String localTxId; } Above is a just a rough idea. So any thoughts? -- Daniel Qian 博客:https://segmentfault.com/u/chanjarster github:https://github.com/chanjarster