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