IceRPC之排程管道->快樂的RPC

xlgwr發表於2024-05-25

作者引言

很高興啊,我們來到了IceRPC之排程管道->快樂的RPC, 基礎引導,有點小壓力,打好基礎,才能讓自已不在迷茫,快樂的暢遊世界。

排程管道 Dispatch pipeline

瞭解如何接受請求並返回響應。

定義

接受/完成請求,並返回響應的過程稱為排程

排程通常由伺服器連線建立: 伺服器連線,接收請求並返回響應。

然而,由於客戶端和伺服器連線具有相同的功能,因此客戶端連線,也可以排程請求。

排程抽象

當連線接收到請求時,它會使用其配置的排程程式,排程此請求。該排程程式是接受傳入請求,並返回傳出響應的抽象。它是呼叫者invoker抽象伺服器端的對應部分。

InvokerDispatcher 之間的一個重要區別,是需要實現 Dispatcher 抽象來滿足請求並生成響應。Invoker 抽象由 IceRPC 的連線實現。

C# 中, 這個排程器抽象是 IDispatcher 介面:

namespace IceRpc;

public interface IDispatcher
{
    ValueTask<OutgoingResponse> DispatchAsync(
        IncomingRequest request,
        CancellationToken cancellationToken = default);
}

當構建接受此連線的伺服器時,會配置伺服器連線的排程程式。該排程程式不能為空。伺服器與其接受的所有連線,共享其排程程式。例如:

// configures server to use a new Chatbot instance as its dispatcher
await using var server = new Server(new Chatbot());

為客戶端連線,配置排程程式是可選的,因為客戶端連線,可以不接受請求。

C# 中,將客戶端連線的排程程式配置為 ConnectionOptions 類。例如:

using IceRpc;

// ClientConnectionOptions derives from ConnectionOptions
var clientConnectionOptions = new ClientConnectionOptions
{
    Dispatcher = new MyCallback(),
    ServerAddress = new Uri("icerpc://hello.zeroc.com")
};

await using var connection = new ClientConnection(clientConnectionOptions);

處理排程Dispatcher

排程抽象提供了很大的靈活性。一個 Slice 服務是排程程式,因此很容易配置伺服器,將其收到的所有請求,排程到同一個 Slice 服務。

排程器,實現可以排程到,另一個排程器,該排程器本身,排程到另一個排程器,等等;

在伺服器上配置的排程程式,可以是排程程式鏈或樹的頭部,稱為"排程管道"dispatch pipeline.

3種常見的排程型別:

  • Leaf dispatcher
    這是排程管道中的子葉。例如,Slice 服務。

  • Middleware
    中介軟體攔截排程,並將其轉發到"下一個"next排程程式。IceRPC 提供了幾個內建的中介軟體,用於日誌記錄,壓縮等。

  • Router
    路由器根據請求的路徑,將請求路由到,在該路由器註冊的排程程式。還可以託管多一箇中介軟體。

--- title: 一個簡單的排程管道 --- flowchart LR connection -- request --> middleware -- request --> service[Slice service] service -- response --> middleware -- response --> connection

作者結語

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

相關文章