非同步呼叫(1)

2021-07-26 15:02:04 字數 1614 閱讀 7579

適用於被呼叫者執行的為耗時操作、且即時性要求不高,呼叫者執行速度有較高要求的情況。

分析:大多數情況在,但應該支援遠端呼叫。

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 事件使 複雜化了。但是這是在沒有得到伺服器響應的情況下,防止 停止的最安全的方法。通過把該引數設...