在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  PHP  GO/ 調(diào)用rpc失敗了如何處理

調(diào)用rpc失敗了如何處理

一個(gè)注冊(cè)場(chǎng)景,操作1,用戶注冊(cè)時(shí)在子平臺(tái)生成帳號(hào),操作2,調(diào)用rpc服務(wù),在總平臺(tái)上生成帳號(hào)(1和2是兩個(gè)不同的數(shù)據(jù)庫(kù))。問題是如果調(diào)用rpc失敗了(請(qǐng)求超時(shí),或rpc返回錯(cuò)誤等情況),但此時(shí)操作1已經(jīng)執(zhí)行,這時(shí)該如何處理

回答
編輯回答
雅痞

一般主要靠?jī)牲c(diǎn)保證數(shù)據(jù)一致性:
1.事務(wù)控制,如這里操作1執(zhí)行完以后不提交事務(wù),執(zhí)行操作2等操作2返回正常請(qǐng)求了,然后提交操作1的事務(wù)
2.補(bǔ)償機(jī)制,如這里的業(yè)務(wù),可以通過保存請(qǐng)求信息和狀態(tài),然后后續(xù)通過定時(shí)任務(wù)等操作來(lái)掃描是否有總庫(kù)和本地庫(kù)會(huì)員不一致的情況,有的話,進(jìn)行業(yè)務(wù)處理

2018年1月5日 16:54
編輯回答
忘了我

業(yè)務(wù)上能否接收 最終一致性呢

2017年10月9日 01:39
編輯回答
背叛者

事務(wù)回滾,操作1和2都寫在try,catch里。任何一步出問題都throw Exception。比如下面這樣
try{

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

}catch(Exception $e){

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

}

2017年7月4日 17:01
編輯回答
落殤

看你業(yè)務(wù)場(chǎng)景。按照我的做法,既然操作1 子賬號(hào)已經(jīng)成功了, 就使其保持成功,保證用戶在子平臺(tái)的功能。 調(diào)用RPC服務(wù)在總平臺(tái)生成,發(fā)生錯(cuò)誤或者(連接超時(shí))。 那是不是應(yīng)該記錄下來(lái):

如果錯(cuò)誤,應(yīng)該預(yù)警或發(fā)送警告郵件到負(fù)責(zé)人。
連接超時(shí),就持久化下來(lái)再執(zhí)行。

我覺得注冊(cè)這種基礎(chǔ)功能發(fā)生錯(cuò)誤,還是不要用用戶有所感知,應(yīng)該隱形的處理掉。
如果連注冊(cè)都發(fā)生錯(cuò)誤,注冊(cè)不了,那用戶對(duì)你的產(chǎn)品信心何在。

2018年1月7日 18:23
編輯回答
拽很帥

超時(shí)和返回錯(cuò)誤是需要分開處理的

  1. 返回錯(cuò)誤:一般提示用戶自己重試,當(dāng)然1操作也需要回滾
  2. 超時(shí): 提示用戶成功, 通過消息的方式確認(rèn)2是否成功,不成功進(jìn)行重試
2017年7月5日 07:54
編輯回答
安于心

這個(gè)是分布式事務(wù)的問題了...

很難解決,目前關(guān)于這塊也沒有好的方案(開源)。
具體的看自己的項(xiàng)目業(yè)務(wù)需求,手動(dòng)控制事務(wù)吧。

2018年3月3日 00:41