IceRPC之多路複用傳輸>快樂的RPC

xlgwr發表於2024-05-26

作者引言

很高興啊,我們來到了IceRPC之多路複用傳輸>快樂的RPC,基礎引導,打好基礎,才能讓自已不在迷茫,快樂的暢遊世界。

icerpc 和多路複用傳輸

瞭解 icerpc 協議和多路複用傳輸

icerpc 協議

當建立到伺服器地址 icerpc://hello.zeroc.com 的客戶端連線時,指示 IceRPC 建立使用 icerpc 協議的連線。

icerpc 是一種應用層協議,透過多路複用連線傳輸 RPC(請求和響應)。

在討論 icerpc 協議時,我們總是用小寫拼寫 icerpc。這避免了與 IceRPC 框架的混淆

多路複用傳輸

路複用傳輸頁面,描述了在連線內提供獨立流的現代傳輸的抽象。比如,典型的多路複用傳輸是QUIC

icerpc 連線在由多路複用傳輸,建立的多路複用連線,上執行。

--- title: icerpc over quic --- classDiagram class IceRpcConnection class MultiplexedConnection { <<abstraction>> } class QuicConnection IceRpcConnection o-- MultiplexedConnection MultiplexedConnection <|-- QuicConnection

icerpc 協議透過為每個請求 + 響應對建立專用雙向流,透過多路複用連線傳送請求和響應。它為每個單向請求建立單向流,因為單向請求沒有響應。

--- title: RPCs mapped to streams by icerpc --- flowchart LR subgraph Client [icerpc client connection] end subgraph Server [icerpc server connection] end subgraph stream0 [stream] s0["> request >\n < response <"] end subgraph stream1 [stream] s1["< request <\n > response >"] end subgraph stream2 [stream] s2["> one-way request >"] end subgraph stream3 [stream] s3["> request >\n < response <"] end subgraph stream4 [stream] s4["< one-way request <"] end Client --- s0 Client --- s1 Client --- s2 Client --- s3 Client --- s4 s0 --- Server s1 --- Server s2 --- Server s3 --- Server s4 --- Server

由於每個流都是獨立的,因此不存在隊頭阻塞。 可以透過同一連線傳送大小請求和響應的組合:大請求和響應不會阻止,或延遲小請求和響應。

IceRPC 的首選協議

icerpc 自然是 IceRPC 的首選協議。

icerpc 提供了 IceRPC API 和功能的最直接實現。 特別是,IceRPC 的請求欄位、響應欄位和狀態碼按原樣由 icerpc 傳輸。它還支援有效負載連續性。

icerpc 透過雙工連線

目前只有一種標準複用傳輸: QUIC。 由於 QUIC 是新的且不普遍可用,因此可能需要將 icerpc 與傳統的雙工傳輸(例如 TCP)一起使用。

解決方案是 IceRPC 的 Slic 傳輸層。Slic 在雙工傳輸抽象上實現複用傳輸抽象。

--- title: icerpc over tcp --- classDiagram class IceRpcConnection class MultiplexedConnection { <<abstraction>> } class SlicConnection class DuplexConnection { <<abstraction>> } class TcpConnection IceRpcConnection o-- MultiplexedConnection MultiplexedConnection <|-- SlicConnection SlicConnection o-- DuplexConnection DuplexConnection <|-- TcpConnection

C# 中,預設的多路複用傳輸是 TCP 上的 Slic,稱為 tcp。以下語句都建立等效的 icerpc 連線。

// Create a client connection with the default multiplexed client transport, Slic over TCP.
using await var clientConnection = new ClientConnection("icerpc://hello.zeroc.com");

// Make sure we use Slic over TCP (correct but redundant).
using await var clientConnection = new ClientConnection("icerpc://hello.zeroc.com?transport=tcp");

// Create a new multiplexed client transport with default options.
var clientTransport = new SlicClientTransport(new TcpClientTransport());
using await var clientConnection = new ClientConnection(
    "icerpc://hello.zeroc.com",
    multiplexedClientTransport: clientTransport);

收尾

最近寫的都是基礎相關的概念,大家看看就行,以官方為主更為妙哉。

作者結語

  • 一直做,不停做,才能提升速度
  • 翻譯的不好,請手下留情,謝謝
  • 如果對我有點小興趣,如可加我哦,一起探討人生,探討道的世界
  • 覺得還不錯的話,點個
    image

相關文章