適用於被呼叫者執行的為耗時操作、且即時性要求不高,呼叫者執行速度有較高要求的情況。
分析:大多數情況在,但應該支援遠端呼叫。
2、呼叫者和被呼叫者是否連線同乙個資料庫?
分析:of cause.考慮以下兩種策略:
(1)被呼叫者執行失敗,則進入錯誤佇列,人工修正問題後,重試;不回滾呼叫者。
(2)被呼叫者執行失敗,則回滾呼叫者。
策略1人工干預成本高,如果錯誤量巨大,則人工運維成本奇高;而且存在錯誤無法修正的情況,如:呼叫者為下訂單,被呼叫者生成出庫單,沒貨了。
再看策略2,一般情況,呼叫者發起非同步呼叫後會提示提交成功,如果此時再回滾,使用者互動設計會比較複雜。但應支援這種模式。
結論:
支援兩種模式:
(1)直接提交模式:呼叫者直接提交事務,被呼叫者失敗不影響提交者,失敗資訊記錄在日誌中,提供重試機制。
(2)tcc模式:呼叫者設定狀態位,事務提交後狀態為「預提交」,被呼叫者提交後改為「提交」;呼叫者提供回滾邏輯,被呼叫者失敗後,呼叫回滾邏輯,修改狀態為「取消」。
呼叫者決定採用哪種事務補償機制。
4、是否依賴spring bean工廠?
依賴spring bean工廠將降低適用範圍,應考慮沒有spring bean工廠的情況。
但考慮實際情況,大多數應用場景中是有spring bean工廠支援的,而且spring bean工廠可以解決複雜的bean之間依賴關係的問題。
考慮為80%的情況設計的原則,優先支援依賴spring bean工廠的情況。
5、是否要取回結果?同時支援本地呼叫和遠端呼叫,通過以下uri定位被呼叫方法:
//本地呼叫,spring中id為userservice的bean的registerlog方法
string target1 = "userservice.registerlog";
//遠端呼叫,通過rpc-server-alias獲取遠端呼叫配置例項
string target2 = "rpc-server-alias/userservice.registerlog";
// service id中包含「.」,則認為是介面名/類名
string target3 = "cn.dragonberg.user.userservice.registerlog";
string target4 = "rpc-server-alias/cn.dragonberg.user.userservice.registerlog";
// 簡單模式 1
void asynccall.invoke(string target,object...params);
// 高階模式 2
asynccall asynccall = new asynccalli(target,params)
/*** 非同步呼叫失敗時被呼叫。
*/public object rollback(string token,throwable e)
};asynccall.invoke();
同步呼叫與非同步呼叫
一 什麼是同步呼叫與非同步呼叫 定義 1 同步就是整個處理過程順序執行,當各個過程都執行完畢,並返回結果。2 非同步呼叫則是只是傳送了呼叫的指令,呼叫者無需等待被呼叫的方法完全執行完畢 而是繼續執行下面的流程。例如,在某個呼叫中,需要順序呼叫 a,b,c三個過程方法 如他們都是同步呼叫,則需要將他們...
JQ 非同步呼叫
請求 test.php 網頁,忽略返回值。jquery 程式 get test.php 請求 test.php 網頁,傳送2個引數,忽略返回值。jquery 程式 get test.php 顯示 test.php 返回值 html 或 xml,取決於返回值 jquery 程式 get test.ph...
html 非同步呼叫
我們的例項在 open 的第三個引數中使用了 true 該引數規定請求是否非同步處理。true 表示指令碼會在 send 方法之後繼續執行,而不等待來自伺服器的響應。onreadystatechange 事件使 複雜化了。但是這是在沒有得到伺服器響應的情況下,防止 停止的最安全的方法。通過把該引數設...