-
Notifications
You must be signed in to change notification settings - Fork 61
服务调用模式 回滚
ShenJW edited this page Jul 13, 2016
·
136 revisions
- 机制:
+ 如何使用 + Annotation(依赖于AspectJ) + @See[示例下载], 可用于对照以下流程 + 通过修改参数配置开启回滚支持 + kepler配置[@See] ` com.kepler.transaction.impl.DefaultTransaction.actived=true ` + spring配置(仅Annotation需要)[@See] ` ` + 标记方法[@See] ` @Rollback(clazz = Trigger.class, method = "trigger1") ` + 标记方法抛出异常时触发回滚,回滚入口为`Tigger.trigger1` + 回滚方法限制 + 必须在容器中注册 + 必须与代理执行方法签名`完全`相同,@See[Trigger.trigger2]
+ 代理方法 + @See[示例下载], 可用于对照以下流程 + 通过修改参数配置开启回滚支持 ` com.kepler.transaction.impl.DefaultTransaction.actived=true ` + 使用@See[Transaction]代理@See[执行方法] ` public Object commit(Request request, Invoker invoker) throws Exception `
+ 回滚策略及GUID `进入事务后会产生与本次事务绑定的GUID,并贯穿整个请求上下文(包括回滚)` + 最终一致 `由服务方提供幂等保证的执行接口,允许相同参数不断重试直到成功(可使用GUID作为幂等Key)` + @See[Annotation(Trigger1)] + @See[代理方法] + 回滚接口 + @See[Annotation(Trigger2)] + @See[代理方法] + 由于存在服务执行成功但客户端网络异常情况,所以建议设计为双重幂等: `public void rollback(String uuid1, String uuid2, Param param)` 仅当UUID1对应的操作已经被执行时才进行与UUID2绑定的幂等回滚操作 + UUID1对应操作未被执行则跳过后续操作 + UUID1对应操作已被执行 + UUID2对应操作已执行则跳过后续操作 + UUID2对应操作未执行则进行后续操作 + 获取GUID `Guid.get()`
+ 扩展存储 + 实现并注册@See[Persistent]接口 + 通过修改参数配置开启扩展存储 `com.kepler.transaction.impl.Persistents.name=XXX` + 默认存储,@See[FilePersistent]
+ 常用参数 + com.kepler.transaction.impl.DefaultTransaction.delay_interval `Integer类型,延迟回滚队列重试间隔,默认500(毫秒)` + com.kepler.transaction.impl.DefaultTransaction.delay_times `Integer类型,延迟回滚任务重试上线,默认Integer.Max` + com.kepler.transaction.impl.DefaultTransaction.delay_max `Integer类型,延迟回滚队列最大容量,默认Integer.Max.超过容量的回滚任务仅持久化而不会立即重试` + com.kepler.transaction.impl.DefaultTransaction.interval_adjust `Integer类型,每次回滚失败将增加的额外延迟,默认100(毫秒)` + com.kepler.transaction.impl.DefaultTransaction.interval_max `Integer类型,Interval_adjust的调整次数上线,默认10(次)` + com.kepler.transaction.impl.DefaultTransaction.thread `Integer类型,用于回滚的线程数量,默认1` + com.kepler.transaction.impl.FilePersistent.dir `String类型,使用磁盘存储时的目录,默认应用启动路径` + com.kepler.transaction.impl.FilePersistent.prefix `String类型,使用磁盘存储时持久化文件前缀` + com.kepler.transaction.impl.FilePersistent.buffer `Integer类型,使用磁盘存储时读写缓冲区大小,默认500(b)` + com.kepler.transaction.impl.FilePersistent.max `Integer类型,使用磁盘存储时异常恢复(重启)时一次性加载的持久化文件数量,默认Integer.Max`