fontcolor_theme
Deepkit RPC

TCP

TCP は Deepkit RPC の中で最も高速なネットワークトランスポートであり、サーバー間の通信、つまりマイクロサービスや相互に通信する Node プロセスのために使用します。WebSocket でできることはすべてサポートしており(ストリーミング、進捗、バックコントローラー、peer-to-peer)、WebSocket プロトコルのフレーミングはありません。ブラウザは TCP 接続を開けないため、ブラウザでは WebSocket または HTTP を使用してください。自分のアプリケーションの worker threads、Web Workers、子プロセスとの通信には IPC の方が高速です。

サーバーとクライアントは @deepkit/rpc-tcp に含まれています:

npm install @deepkit/rpc-tcp

サーバー

RpcTcpServer は、ホストとポートで RpcKernel を提供します:

import { RpcKernel, rpc } from '@deepkit/rpc';
import { RpcTcpServer } from '@deepkit/rpc-tcp';

@rpc.controller('user')
class UserController {
    @rpc.action()
    hello(name: string): string {
        return 'Hello ' + name;
    }
}

const kernel = new RpcKernel();
kernel.registerController(UserController, 'user');

const server = new RpcTcpServer(kernel, '0.0.0.0:8811');
await server.start();

ホストとポートの代わりにパスを指定すると Unix ソケットで提供され、同一マシン上のプロセス間ではこちらの方が高速です:

const server = new RpcTcpServer(kernel, '/var/run/my-app/rpc.sock');

Unix ソケットはカーネルの TCP/IP スタックを経由しません。同一マシン上では、小さな呼び出しは localhost 上の TCP より約 25% 高速であり(Linux サーバー上で別プロセスへの呼び出し 1 回あたり 45 µs ではなく 34 µs)、100 個のオブジェクトからなる結果では 20% 高速です。スレッド間や自分の子プロセスとの通信では、IPC がさらに高速です。

Deepkit アプリ

Deepkit アプリはコントローラーを WebSocket で提供し、httpRpcBasePath を指定すると HTTP でも提供します。TCP でも提供するには、サーバーの起動時にアプリの RpcKernel を RpcTcpServer に渡します。コントローラー、アプリのプロバイダー、RpcKernelSecurity は WebSocket の場合と同じように動作します:

import { App } from '@deepkit/app';
import { FrameworkModule, onServerMainBootstrap, onServerMainShutdown } from '@deepkit/framework';
import { RpcKernel } from '@deepkit/rpc';
import { RpcTcpServer } from '@deepkit/rpc-tcp';

let tcp: RpcTcpServer | undefined;

new App({
    controllers: [UserController],
    imports: [new FrameworkModule()],
})
    .listen(onServerMainBootstrap, async (event, kernel: RpcKernel) => {
        tcp = new RpcTcpServer(kernel, '0.0.0.0:8811');
        await tcp.start();
    })
    .listen(onServerMainShutdown, () => tcp?.close())
    .run();

クライアント

import { RpcClient } from '@deepkit/rpc';
import { RpcTcpClientAdapter } from '@deepkit/rpc-tcp';

const client = new RpcClient(new RpcTcpClientAdapter('localhost:8811'));
const user = client.controller<UserController>('user');

await user.hello('Peter'); // 'Hello Peter'

クライアントは最初の呼び出し時に接続し、接続が失われた場合は次の呼び出し時に再接続します。Unix ソケットの場合は、そのパスを渡します: new RpcTcpClientAdapter('/var/run/my-app/rpc.sock')。

認証

クライアントに設定されたトークンは接続ごとに 1 回送信され、RpcKernelSecurity.authenticate がそれを接続のセッションに変換します。セキュリティ を参照してください。

client.token.set('my-session-token');
English中文 (Chinese)한국어 (Korean)日本語 (Japanese)Deutsch (German)