Comments (10)
嗯,ANNOTATION确实可以减少入侵,耦合,让代码更优雅,不过我个人短期不会做这个,希望有人能帮忙做一下。
之前我也对这个做了点思考,改成注解形式主要就是用ANNOTATION封装一下现有的逻辑,但是改成ANNOTATION并使用DUBBO/FEIGN之类注入接口实现的形式的话,会使得一些效率优化操作失效,如:
- 现在的接口里返回的是FUTURE,要拿结果时才统一执行及写日志。改成接口同步调用形式会使得每次调用都写日志以及执行RPC
- 调用startEasyTransaction这个操作要改成Annotation形式,该操作就会在事务方法前执行,这样的话就比较难以在transactionId中引入一些带有业务含义的KEY
from easytransaction.
确实, 接口可以强制,可以使问题简单。
spring webflux其实也有这个问题,要使用reactive, 返回接口类型就有强制要求,也是一个编程习惯的改变和要求,但是我相信这个都不是问题,只要文档说明清楚。
还有就是,如果里面的事务改成隐式,不手动program调用,就不会存在这个问题了,因为透明,用户不参与。
from easytransaction.
如果里面的事务改成隐式,不手动program调用,就不会存在这个问题了,因为透明,用户不参与。
隐式是怎样的一个形式?通过注解开启分布式事务,通过调用 业务接口INTERFACE(非框架代码)调用分布式事务服务?
from easytransaction.
最简单一直就是aop拦截spring的Transactional, 然后可以实现Order顺序(spring自带)在spring的transaction之内或之前(需要细想),然后按照现在Facade的方式开启start流程。
另一种就是嵌入到spring的transaction的流程handler中,另一种filter,一样也是FilterChain,注册到事务的Chain中。 里面的调用,肯定还是Easy的代码,只是嵌入到chain中。本质上不影响现有设计,调用方通过隐式事务chain,记录日志发送消息。 消费端,影响就更不大了。
from easytransaction.
不知道我有没有理解错,你的想法是希望在本地事务方法里完全不显示调用远程方法(包括业务自行定义的远程服务Interface的实例)
start方法可以不在业务代码里写,但远程业务方法调用是省不掉的,要省掉的话,其只能适应于无需外部服务配合就能完成的事务的场景(使用消息队列实现的场景)
一旦涉及需要拿远程的处理结果来决定 后续逻辑(分支逻辑)及 事务结果(回归/提交)时,就行不通了。因为业务需要那些结果,所以不能做到完全隐式。
from easytransaction.
一旦涉及需要拿远程的处理结果来决定 后续逻辑(分支逻辑)及 事务结果(回归/提交)时,就行不通了。因为业务需要那些结果,所以不能做到完全隐式。
这个也是一个道理,业务调用的时候,就是正常的一个业务调用。
A, B
class B {
@transactional
public Result businessB() {
return ..;
}
}
class A {
@Autoward
B b;
@transactional
public void businessA() {
Result r = b.businessB();
....
}
}
都是打了@transactional, 所以businessA 是一个发起者,可以知道, 执行到b.businessB(), 知道是一个参与者。
aop对businessA开始执行隐式框架拦截, 里面aop的process执行中,自然流动到了b.businessB(), 这个时候就执行参与者的逻辑。里面的上下文事务环境判断,这些就是小意思了,easy里面的代码已经包含了。
里面b.businessB()的furthure要拿结果,也是在业务代码里面就get了,所以不影响,外面的aop不需要参与。
那么所有的流程都在框架的管理之中,无论是远程还是本地,都受控制。
总结一点,这个跟普通的事务是没有区别的,普通的事务,也是一样进行嵌套的,我们可以看作,背后并不关心是否是远程还是本地。
from easytransaction.
恩,我明白你指代的隐式的含义了。这个是可以实现的,缺点就是我上面写的,做不了性能优化,RPC/日志等都要同步实时做,而不能批量去做。
好处也是我们之前就说到的,更加透明,客户无感
from easytransaction.
性能优化其实是一样的,是指用户调用get之前的那段时间,后端可以发送日志记录,合并发送消息。但是细想,其实是一样的,手动代码调用的中间的那个间隔,和aop调用方式,中间该有的等待还是有。
a的业务代码 50ms
执行到b的bussiness,中间的间隔,无论是手动,还是aop,其实都一样的
from easytransaction.
做成隐式时,代码就相当于
Future requestAFuture = transaction.execute(requestA);
ResultA a = requestAFuture.get();//写日志,RPC调用
Future requestBFuture = transaction.execute(requestB);
ResultB b = requestBFuture.get(); //写日志,RPC调用
但如果显式的做法,可以这么写
Future requestAFuture = transaction.execute(requestA);
Future requestBFuture = transaction.execute(requestB);
ResultA a = requestAFuture.get();//合并写日志,并发RPC调用
ResultB b = requestBFuture.get(); //仅仅获取结果
这个问题我们别在这里讨论了,会推给很多人,打扰很多人,继续讨论可以加我微信 skyesx
from easytransaction.
已完成见 #57
from easytransaction.
Related Issues (20)
- 有计划支持dubbo2.7吗? HOT 1
- 请问有具体的sample吗?感觉不容易上手使用?建议作者以后可以提供使用文档。谢谢。 HOT 1
- 对框架幂等疑问? HOT 2
- ons异步消息有非侵入式写法的demo吗?
- 建议
- TCC方案实现的话是否可以考虑下websocket HOT 1
- EtReliableMsgAnnotationBusinessProviderBuilder 和 EtBestEffortMsgAnnotationBusinessProviderBuilder执行consume,永远返回EasyTransConsumeAction.CommitMessage,这是不是有问题? HOT 1
- EasyTransMsgInitializer 消息消费,如果业务代码抛异常,框架代码空指针问题 HOT 1
- DatabaseSnowFlakeIdGenerator has something wrong? HOT 2
- HikariDataSource (HikariPool-1) is not DataSourceProxy, please correct the config! HOT 2
- 用tcc-and-fescar这个demo并发测试同一个请求,锁表fescar_lock主键冲突。 HOT 3
- Dependency conflicts on org.ow2.asm:asm, leading to invoking unexpected methods HOT 1
- 现在这个框架可以整合mybatis吗? HOT 1
- 请问下如果某个分支服务异常,但是使用kafka消息队列的服务不能回滚?请教下采用kafka消息队列的这个服务怎么才能回滚? HOT 2
- ET感觉太难入门了,希望出几篇文章介绍源码
- 同一个服务多个数据源事务一致性问题
- Demo
- 能否升级支持一下springboot 2.X
- 请教:这个EasyTransaction能够支持微软的SQL Server吗
- ET集成Seata AT模式时,EtDataSourceManager类获取不到DataSourceProxy
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from easytransaction.