02 通过线程池同步数据确保用户请求只会发送一次

本文针对基于SAAS架构的数据隔离问题,探讨了如何通过线程池同步项目和用户数据,确保用户请求只发送一次并保证数据一致性。解决方案包括在系统间加入同步组件,利用P-WEB项目启动和定时任务触发数据同步,确保即使同步失败也能最终成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

“01 基于SAAS架构通过双租户实现单位和项目细粒度数据隔离”,遗留问题如下:

  1. 项目数据如何同步?
  2. 用户数据如何同步?
  3. 如何确保用户请求只发送一次?

上述问题,与平台用户提现到银行卡以及很多系统间通信类似,不管银行接口发生什么问题(如挂机,出错等),用户只需要发起一次提现请求,平台告诉用户正在提现中,直到平台访问银行接口成功,告诉用户体现成功。

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);
    }
   }

3.3 数据同步


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值