處理連線中斷
RPC 呼叫完成之後,不會關閉連線;它標示為免費。 因此,當連線位於集區時,伺服器可能會關閉或網路連線在通話期間或之間遺失。 就原則而言,只有在符合下列兩個條件時,RPC 執行時間才會重新嘗試這些呼叫:
- 伺服器無法執行呼叫,或呼叫具有等冪性。
- 用戶端可以有效率的方式實作重試。
下列段落會展開並厘清這兩個條件。
等冪呼叫是可在伺服器上多次執行的呼叫,而不會產生不想要的副作用。 例如,在銀行中查詢指定帳戶餘額的 RPC 呼叫是等冪的。 如果因為連線中斷而執行此呼叫兩次,則不會造成損害。 另一個等冪呼叫範例是變更資料庫中客戶的位址。 執行兩次很正常,因為第二次執行只會以相同的位址取代已經存在的位址。 「從帳戶 xyz 減去五元」之類的作業不是等冪的。 網路連線中斷不應該造成這類呼叫的多次執行。
若要安全,RPC 執行時間會將所有呼叫視為非等冪。 ncacn_ip_tcp不支援 [等冪] 屬性,而且會被忽略。 因此,上述清單中的第一個條件會縮減為 無法執行呼叫的伺服器。
在許多情況下,RPC 執行時間無法確定尚未在伺服器上執行呼叫。 在這種情況下,用戶端不會重試執行呼叫。
下列範例說明 RPC 執行時間何時執行或未重試呼叫:
伺服器重新開機。
簡單的無安全性 RPC 呼叫是在重新開機之後未進行先前呼叫的介面上進行。 由於此介面上沒有呼叫,因此 RPC 執行時間會先嘗試交涉介面的使用。 它會使用集區中的連線來傳送封包。 由於伺服器已重新開機,且連線不再有效,因此會傳回錯誤。 由於用戶端 RPC 執行時間尚未開始傳送實際呼叫的資料,因此用戶端會判斷伺服器可能無法在這些資料上執行。 因此,它會關閉連線,並在集區中尋找另一個連線。 如果找不到連接,則會開啟新的連線,並嘗試再次交涉使用介面。 如果成功,則會 (進行呼叫,也就是重試,因為呼叫在啟動) 之前偵測到失敗。
具有隱私權層級安全性 (加密) 的 RPC 呼叫是在已交涉的安全性內容連線上進行。
為了確保有效率的效能,RPC 執行時間會將封送處理的封包內嵌加密, (純文字資料) 。 如果嘗試傳送資料失敗,RPC 執行時間無法重試呼叫,因為已以加密的資料覆寫純文字資料,而且無法以新的安全性內容重新加密資料。 因此,不會重試。
傳送非第一個片段會失敗。
未重試,因為 RPC 執行時間可能會選擇在完成之後捨棄第一個片段的內容,而且無法重試傳送第一個片段。
RPC 要求會傳送。
伺服器中止連接。 不會嘗試重試,因為 RPC 無法分辨伺服器是否收到呼叫並開始執行它。
如果伺服器使用動態端點,RPC 將不會在重試期間重新解析端點。 這表示,如果伺服器關閉並備份,它可能位於不同的端點上,而 RPC 不會在重試呼叫時以透明方式重新解析端點。 若要強制重新解析端點,RPC 用戶端應該先呼叫 RpcBindingReset ,再重試呼叫。
在這些情況下,如果 RPC 用戶端可以判斷呼叫是否具有等冪性,或如果它保留 RPC 捨棄的資料,它可能會選擇在 RPC 之上建置重試機制。
注意
如果伺服器是叢集,而叢集的不同節點會執行不同版本的伺服器軟體,RPC 重試可能會在容錯移轉的情況下,將呼叫放在叢集的不同節點上,也可能位於不同版本的伺服器上。 在這類部署案例中,請確定用戶端不會依賴特定版本的伺服器軟體來執行指定的呼叫。 如果這樣做,用戶端應該在 RPC 之上建置機制,以偵測並處理這類狀況。