OceanBase RPC機制簡要說明
http://note.youdao.com/share/?id=d2163a7ba8ec1ec58e64683a961c5121&type=note
RPC是OB一個比較重要的各個元件間進行通訊的實現機制。最近在看clog的程式碼,就順著ObCLogRpc這個類,簡單總結下OB進行RPC的幾種寫法,主要偏重於寫程式碼和理解已有程式碼,不涉及到底層的RPC實現機制。 曲山的OB程式碼導讀 5.3.2節客戶端部分介紹了ObRpcStub,建議先行閱讀。 後邊是當前OB實現RPC的幾種典型寫法: 客戶端 ObCLogRpc、ObUpsRpcStub和ObRootRpcStub都繼承自common::ObCommonRpcStub,common::ObCommonRpcStub提供一些基礎的RPC實現,其繼承自ObGeneralRpcStub,ObGeneralRpcStub繼承自ObRpcStub,後者封裝了RPC的底層實現,包括ObClientManager的一個指標型別成員rpc_frame_。 客戶端實現rpc的幾種典型寫法如下: 1)rpc_frame_ -> send_request 典型實現參考ObCommonRpcStub :: send_log,是一個同步呼叫方式。 2)rpc_frame_ -> post_request 典型實現參考ObCLogRpc::post_log,此實現是一個非同步呼叫方式,需要在post_request中指明接收到響應後回撥使用的handler; 3)呼叫send_*_return_*函式,是個同步呼叫方式,具體可參見OB程式碼導讀相關章節,舉例如下:14)呼叫send_param_*/deserialize_result_*兩個配對的巨集,具體實現可參考ObGeneralRpcStub::register_server,也是一個同步呼叫方式。 其實後兩者就是呼叫1)來完成的,這些巨集會進行展開,直接傳遞基礎資料型別或是呼叫輸出輸出引數的serialize/deserialize方法進行序列化、反序列化後傳遞。 服務端int ObCommonRpcStub :: renew_lease(const common::ObServer& master, const common::ObServer& slave_addr, const in t64_t timeout_us) 2 { 3 return send_1_return_0(master, timeout_us, OB_RENEW_LEASE_REQUEST, DEFAULT_VERSION, slave_addr); 4 }