1 概述
“01 基于SAAS架构通过双租户实现单位和项目细粒度数据隔离”,遗留问题如下:
- 项目数据如何同步?
- 用户数据如何同步?
- 如何确保用户请求只发送一次?
上述问题,与平台用户提现到银行卡以及很多系统间通信类似,不管银行接口发生什么问题(如挂机,出错等),用户只需要发起一次提现请求,平台告诉用户正在提现中,直到平台访问银行接口成功,告诉用户体现成功。
2 解决方案
在两个系统之间加入同步组件,做数据同步。
2.1 项目数据同步
2.2 团队成员数据同步
2.1 用户数据同步
在上述同步组件中,任何一步都有可能同步失败,在实际项目中基本上是P-WEB项目未启动情况下发生,故先如步骤9 在P-WEB项目启动后触发数据同步组件;为了确保数据同步其他情况同步发生,故加入8 定时任务,每隔一段时间检查未同步的数据,触发同步组件。这样,确保用户只操作一次,数据一定同步成功。
3 代码案例
由于三个同步组件实现步骤一样,故以项目数据同步进行举例。
3.1 项目增删改
略
3.2 Aspect
@Aspect
@Component //注意点1:必须将这个切面类注册为bean,可以在这里通过@Component 注入,也可以自己在xml中注入
public class SubjectAspect {
@Autowired
private SubjectService subjectService;
@Pointcut("execution(* com.alban.modules.subject.web. SubjectController.save(com.ynyunling.modules.subject.entity.Subject)) "
+ "&& args(subject)") //注意点2:args的参数必须与连接点方法的参数一样
public void save(Subject subject){
}
@AfterReturning("save(subject)")
public void afterSaveReturn(Subject subject){
subjectService.saveAndSyncDataBySubject(subject, Subject.NORMAL_SAAS_STATUS);
}
}