一个注册场景,操作1,用户注册时在子平台生成帐号,操作2,调用rpc服务,在总平台上生成帐号(1和2是两个不同的数据库)。问题是如果调用rpc失败了(请求超时,或rpc返回错误等情况),但此时操作1已经执行,这时该如何处理
一个注册场景,操作1,用户注册时在子平台生成帐号,操作2,调用rpc服务,在总平台上生成帐号(1和2是两个不同的数据库)。问题是如果调用rpc失败了(请求超时,或rpc返回错误等情况),但此时操作1已经执行,这时该如何处理
一般主要靠两点保证数据一致性:
1.事务控制,如这里操作1执行完以后不提交事务,执行操作2等操作2返回正常请求了,然后提交操作1的事务
2.补偿机制,如这里的业务,可以通过保存请求信息和状态,然后后续通过定时任务等操作来扫描是否有总库和本地库会员不一致的情况,有的话,进行业务处理
超时和返回错误是需要分开处理的
看你业务场景。按照我的做法,既然操作1 子账号已经成功了, 就使其保持成功,保证用户在子平台的功能。 调用RPC服务在总平台生成,发生错误或者(连接超时)。 那是不是应该记录下来:
如果错误,应该预警或发送警告邮件到负责人。
连接超时,就持久化下来再执行。
我觉得注册这种基础功能发生错误,还是不要用用户有所感知,应该隐形的处理掉。
如果连注册都发生错误,注册不了,那用户对你的产品信心何在。
4 回答1.5k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
2 回答899 阅读✓ 已解决
2 回答765 阅读✓ 已解决
事务回滚,操作1和2都写在try,catch里。任何一步出问题都throw Exception。比如下面这样
try{
}catch(Exception $e){
}