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

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

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

回答
編輯回答
雅痞

一般主要靠兩點保證數(shù)據(jù)一致性:
1.事務(wù)控制,如這里操作1執(zhí)行完以后不提交事務(wù),執(zhí)行操作2等操作2返回正常請求了,然后提交操作1的事務(wù)
2.補償機制,如這里的業(yè)務(wù),可以通過保存請求信息和狀態(tài),然后后續(xù)通過定時任務(wù)等操作來掃描是否有總庫和本地庫會員不一致的情況,有的話,進行業(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出錯');
}
if(//提交2===false){
    throw Exception('提交2出錯');
}
$db->commit();

}catch(Exception $e){

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

}

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

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

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

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

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

超時和返回錯誤是需要分開處理的

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

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

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

2018年3月3日 00:41