在微服务中,利用webapi实现分布式事务

在网上搜索C#实现分布式事务,看起来挺复杂的,常见的是CAP这个组件。经过一段时间的研究,发现可以使用简单的WebApi来实现分布式事务,且并不需要事务中心服务。

分布式事务关键是一致性,需要考虑以下几个问题:

1、确保事务的一致性

2、防止事务丢失,或者微服务丢失

3、简化程序员对事务的实际控制,仅仅提供发起事务、提交或者回滚事务三个调用方法

这里先说明一下原理。

1、本质上,每个微服务内的事务依旧是一个ado.net的Transaction对象,通过创建该对象来发起事务,若单个微服务中同时访问多个数据库,则需要在访问数据库的时候,创建对应的事务对象。每个微服务均创建两个API接口,/api/[resource]/commit和/api/{resource}/rollback,这里不讨论权限问题,自行设计即可。

2、微服务的事务之间的一致性,通过Api的header传递transactionKey,把当前的事务key传递到另外一个微服务。注意,webapi接收api请求,都要去检查是否存在事务key,建议在controller的基类中,拦截该数据,类似token一样,然后把这个key传递到业务层中。

3、业务层接收到事务key的时候,创建一个事务缓存TransCache,并且把这个事务key传递到数据层,并且把涉及到的数据层缓存到TransCache,这样就可以事后可以重新获取所有的数据层调用commit、rollback

4、为了调用的统一性,可以建立一个ITrans接口,里边就定义Commit()和Rollback()两个方法,并且,把访问WebApi的方法,也封住成一个虚拟的数据层,并实现ITrans接口,方便业务层统一调用。访问数据库的数据层,则使用transaction结束事务,api的数据层,则发起api请求结束事务。

5、一旦调用结束事务的方法,每个微服务都要清除掉所有的事务缓存。

此方法可能比较笼统,经过2年多的实际使用,一切尚好,对于单个微服务,还采用了AOP的方法自动发起事务,直接简化了AOP的发起和结束操作,并把这一切的动作做了日志记录。AOP采用的是MethodBoundaryAspect这个组件,该组件免费,功能也足够了。

https://github.com/vescon/MethodBoundaryAspect.Fody

api请求组件使用的是RestSharp,也可以在github中找到,直接nuget加载到项目即可。

你可能感兴趣的:(分布式,微服务,分布式,c#,架构,数据库)