H5W3
当前位置:H5W3 > go > 正文

【go】調用rpc失敗了如何處理

一个注册场景,操作1,用户注册时在子平台生成帐号,操作2,调用rpc服务,在总平台上生成帐号(1和2是两个不同的数据库)。问题是如果调用rpc失败了(请求超时,或rpc返回错误等情况),但此时操作1已经执行,这时该如何处理

事务回滚,操作1和2都写在try,catch里。任何一步出问题都throw Exception。比如下面这样
try{

$db->beginTransaction();
//if(//提交1===false){
throw new Exception('提交1出错');
}
if(//提交2===false){
throw Exception('提交2出错');
}
$db->commit();

}catch(Exception $e){

$db->rollBack();
return $e->getMessage();

}

一般主要靠两点保证数据一致性:
1.事务控制,如这里操作1执行完以后不提交事务,执行操作2等操作2返回正常请求了,然后提交操作1的事务
2.补偿机制,如这里的业务,可以通过保存请求信息和状态,然后后续通过定时任务等操作来扫描是否有总库和本地库会员不一致的情况,有的话,进行业务处理

业务上能否接收 最终一致性呢

超时和返回错误是需要分开处理的

  1. 返回错误:一般提示用户自己重试,当然1操作也需要回滚
  2. 超时: 提示用户成功, 通过消息的方式确认2是否成功,不成功进行重试

这个是分布式事务的问题了…

很难解决,目前关于这块也没有好的方案(开源)。
具体的看自己的项目业务需求,手动控制事务吧。

看你业务场景。按照我的做法,既然操作1 子账号已经成功了, 就使其保持成功,保证用户在子平台的功能。 调用RPC服务在总平台生成,发生错误或者(连接超时)。 那是不是应该记录下来:

如果错误,应该预警或发送警告邮件到负责人。
连接超时,就持久化下来再执行。

我觉得注册这种基础功能发生错误,还是不要用用户有所感知,应该隐形的处理掉。
如果连注册都发生错误,注册不了,那用户对你的产品信心何在。

回答

本文地址:H5W3 » 【go】調用rpc失敗了如何處理

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址