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

Reply via email to