为了更好的学习Apache ServiceComb Pack,saga-spring-demo设定一个实际需要分布式一致性的业务场景来方便理解。
上图中:用户对预定服务Booking发起请求,其中租车订单服务car和酒店订单服务hotel没有依赖关系,租车服务是不知道酒店服务的执行情况。 对于预订服务来说,如果没有相关的服务调用协调机制的话,预订服务是很难保证其调用的租车服务以及酒店服务要么同时成功,要么同时失败。
上图中:Pack架构中包含两个重要组件,即Omega客户端和Alpha服务端, 另外还有用来持久化的DB。
结合图一:Demo中有三个独立进程服务,订单服务booking、租车服务car、酒店服务hotel,这些服务进程中均包含了omega客户端,Omega客户端会向Alpha服务端发送服务调用的消息,这样alpha服务端充当协调器协调这些服务之间的调用。
例:当异常情况下,如ServiceB的事务执行失败,Alpha扫描到Omega发送的TxAbortedEvent事件,就会回调ServiceA的补偿方法,执行自定义回滚逻辑,使各服务回到事务执行之前的状态。
成功场景下,全局事务事件SagaStartedEvent对应SagaEndedEvent ,每个子事务开始的事件TxStartedEvent都会有对应的结束事件TXEndedEvent。
异常场景下,Omega会向Alpha上报中断事件TxAbortedEvent,然后Alpha会根据全局事务的执行情况, 想其它已成功的子事务(以完成TXEndedEvent)的服务发送补偿指令,以确保最终所有的子事务要么都成功,要么都回滚。
超时场景下,已超时的事件会被alpha的定期扫描器检测出来,同时该超时事务对应的全局事务也会被中断。
1.用户发送Request请求调用业务方法(business logic)
2.preIntercept向alpha发送TxStartedEvent
3.被AOP拦截的方法(business logic)被调用
4.当执行成功时postIntercept发送TxEndedEvent到alpha
5.最后业务方法向用户发送response