淘先锋技术网

首页 1 2 3 4 5 6 7

dubbo泛化调用细节是如何实现的?

服务A与服务B属于不同的应用,通过dubbo远程调用,要做到二者写库操作一同提交/一同回滚,服务A和服务B必须参与同一个跨应用的全局事务,并保证二者对应的DB事务必须作为该全局事务的分支事务。这样,事务管理模块在明确了该全局事务的完成方向(commit/rollback)后,再将该全局事务下的所有分支事务逐个提交/回滚。

这是分布式事务管理的大致逻辑,其中,上述“将所有分支事务逐个提交/回滚”过程是分布式事务处理的关键,需要有相应故障恢复的机制,例如,当服务A的DB事务已经提交(服务B的DB事务尚未提交)时,若服务B所在节点宕机(或其使用的DB宕机)时,如何保证服务B的DB事务仍能正常提交。这个过程的实现机制有很多种,常见的有XA 2PC和TCC。

XA机制将提交过程分成prepare、commit两个阶段,事务管理模块在prepare服务A的DB事务、服务B的DB事务都成功后,再逐个commit这些DB事务。DB在prepare返回OK后,如果没有收到来自事务管理模块的commit/rollback请求则会一直保留该分支事务的数据。因此,若上述宕机故障出现在prepare阶段,则可以通过将prepare过的分支事务回滚,来达到全局事务回滚;若上述宕机故障出现在commit阶段,后续仍然可以再次commit那些未成功commit的分支事务,最终达到全局事务提交。

TCC机制下,事务管理模块是在服务A、服务B执行完毕后即刻提交其参与的DB事务。而后,如果全局事务决定提交,则逐个调用服务A和服务B的confirm逻辑;如果全局事务决定回滚,则逐个调用服务A和服务B的cancel逻辑(当然,confirm/cancel逻辑的执行中又会参与相应的DB事务)。若发生上述宕机故障,则只需要根据全局事务当前状态,将服务A、服务B相应的confirm/cancel逻辑重新调用即可。因confirm/cancel逻辑可能会被多次调用,因此,需要保证其幂等性。

知名的分布式事务管理器主要有atomikos、bitronix、narayana。其中,仅atomikos支持XA和TCC两种机制,bitronix、narayana仅支持XA机制。这三者都不提供对dubbo的开箱即用的支持,需要自行集成。

目前对dubbo提供开箱即用支持的分布式事务管理器有:ByteJTA(基于XA机制)、ByteTCC(基于TCC机制)。

java dubbo用法,dubbo泛化调用细节是如何实现的