mcpField
D
dotnet-service-communication

dotnet-service-communication

github.com/wshaddix開発8676 回インストール35 週間前に更新
リポジトリ

dotnet-service-communication について

遅延、通信方向、クライアント種別、ペイロード形式などの要件から、.NET のサービス通信プロトコルを選ぶためのスキルです。5 種類のプロトコルを比較し、実装の詳細を扱う専門スキルも案内します。

主な機能

  1. 015 種類のプロトコルを選ぶ決定表
  2. 02要件に基づくプロトコル比較
  3. 03gRPC、SignalR、SSE、JSON-RPC 2.0、REST の解説
  4. 04実装を扱う専門スキルへのリンク

活用シーン

  1. 01ブラウザー向けサービスのプロトコル選定
  2. 02内部サービスの通信方式の選定
  3. 03複数プロトコルを使う API の設計

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshaddix/dotnet-skills --skill dotnet-service-communication

インストール後、Claude Code で/dotnet-service-communicationを入力して読み込まれたか確認します。

詳細

dotnet-service-communication

適切なサービス通信プロトコルを選択するための、上位レベルのルーティングスキルです。要件(レイテンシ、通信方向、クライアントの種類、ペイロード形式、ブラウザー対応)を、主要な 5 つの .NET 通信プロトコル(gRPC、SignalR、SSE、JSON-RPC 2.0、REST)に対応付ける判断表を提供します。実装の詳細については、専門スキルに案内します。

対象外: HTTP クライアントファクトリのパターンとレジリエンスパイプラインについては、[skill:dotnet-http-client] と [skill:dotnet-resilience] を参照してください。ネイティブ AOT のアーキテクチャとトリミング戦略については、AOT コンパイルに関する [skill:dotnet-native-aot]、AOT を前提とした設計パターンに関する [skill:dotnet-aot-architecture]、トリミングに安全な開発に関する [skill:dotnet-trimming] を参照してください。

相互参照:gRPC の実装については [skill:dotnet-grpc]、SignalR/SSE/JSON-RPC の詳細については [skill:dotnet-realtime-communication]、REST/HTTP クライアントのパターンについては [skill:dotnet-http-client] を参照してください。サービス通信パターンのテストについては、[skill:dotnet-integration-testing] を参照してください。


判断表

要件に基づいて適切なプロトコルを選択するには、この表を使用してください。

要件gRPCSignalRSSEJSON-RPC 2.0REST
通信方向4 種類すべてのパターン全二重サーバーからクライアントリクエスト/レスポンスリクエスト/レスポンス
通信形式Protobuf(バイナリ)JSON または MessagePackテキスト(JSON 行)JSONJSON/XML
ブラウザー対応gRPC-Web(プロキシが必要)はい(JS クライアント)はい(ネイティブの EventSource)WebSocket 経由はい(fetch/XHR)
コントラクト.proto スキーマHub インターフェイス慣例JSON-RPC 仕様OpenAPI/Swagger
レイテンシ最低低低中中
スループット最高高中程度中程度中程度
ストリーミング4 種類すべてのパターンサーバー側とクライアント側のストリーミングサーバープッシュのみなしなし(チャンク転送)
接続HTTP/2 の持続接続WebSocket(フォールバックあり)HTTP/1.1 以降の持続接続トランスポートに依存リクエストごと
サービス間通信最適良好限定的特定用途向け良好
AOT 対応はい(Protobuf)はいはいはいはい(STJ ソース生成を使用)

判断フローチャート

Is this service-to-service (no browser)?
├── Yes → Do you need streaming?
│   ├── Yes → gRPC streaming [skill:dotnet-grpc]
│   └── No → Is it request-response?
│       ├── High throughput / binary → gRPC (unary) [skill:dotnet-grpc]
│       └── Standard CRUD / public API → REST [skill:dotnet-http-client]
└── No (browser client) → Do you need real-time?
    ├── Yes → Do you need bidirectional?
    │   ├── Yes → SignalR [skill:dotnet-realtime-communication]
    │   └── No (server push only) → SSE [skill:dotnet-realtime-communication]
    └── No → REST [skill:dotnet-http-client]

Special cases:
- LSP / tooling protocol → JSON-RPC 2.0 [skill:dotnet-realtime-communication]
- Mixed (browser + service-to-service) → REST for browser, gRPC for internal

プロトコルの概要

gRPC

最適な用途: サービス間通信、高スループットのストリーミング、厳密に型付けされたコントラクト。

  • .proto ファイルを使ったスキーマファースト開発
  • 4 種類すべてのストリーミングパターン:単項、サーバーストリーミング、クライアントストリーミング、双方向
  • ペイロードを最小化し、スループットを最大化するバイナリシリアル化(Protobuf)
  • クライアントとサーバーのスタブを自動生成する機能を内蔵
  • ネイティブのロードバランシングとヘルスチェックプロトコルに対応

使用しない方がよい場合: ブラウザーとの直接通信(gRPC-Web プロキシが必要)、外部クライアントが利用するシンプルな CRUD API、人間が読みやすいペイロードが必要なシナリオ。

実装の詳細については、[skill:dotnet-grpc] を参照してください。

SignalR

最適な用途: ブラウザー向けのリアルタイムアプリケーション、対話型ダッシュボード、チャット、共同作業機能。

  • トランスポートを自動でネゴシエーション(WebSocket → SSE → Long Polling)
  • グループ管理とユーザー指定機能を内蔵
  • 厳密に型付けされたインターフェイスを備える Hub 抽象化
  • Redis バックプレーンまたは Azure SignalR Service によるスケーリング
  • JSON と MessagePack のシリアル化に対応

使用しない方がよい場合: サーバーからクライアントへの一方向プッシュ(代わりに SSE を使用)、サービス間通信(代わりに gRPC を使用)、SignalR クライアントライブラリを組み込めないシナリオ。

SignalR のパターンと Hub の実装については、[skill:dotnet-realtime-communication] を参照してください。

Server-Sent Events(SSE)

最適な用途: シンプルなサーバーからクライアントへのプッシュ通知、ライブフィード、ステータス更新。

  • .NET 10 の ASP.NET Core に TypedResults.ServerSentEvents として組み込まれています
  • ブラウザー標準の EventSource API を使用するため、クライアントライブラリは不要です
  • Last-Event-ID による自動再接続に対応しています
  • WebSocket アップグレードをブロックする HTTP/1.1 プロキシ経由でも動作します
  • リアルタイム通信の選択肢の中で最も軽量です

使用すべきでない場合: 双方向通信が必要な場合(SignalR を使用)、高スループットのバイナリストリーミングが必要な場合(gRPC を使用)、クライアントからサーバーへのメッセージが必要な場合。

SSE の実装の詳細については、[skill:dotnet-realtime-communication] を参照してください。

JSON-RPC 2.0

最適な用途: ツール用プロトコル(Language Server Protocol)、シンプルなトランスポートを介した構造化 RPC。

  • トランスポートに依存しません(HTTP、WebSocket、stdio、名前付きパイプ)
  • リクエスト、レスポンス、通知のセマンティクスが明確に定義されています
  • StreamJsonRpc を介して Visual Studio、VS Code、.NET のツールで使用されています
  • スキーマ管理を必要としない場合に、gRPC に代わる軽量な選択肢です

使用すべきでない場合: リアルタイムストリーミングが必要な場合(SignalR または gRPC を使用)、サービス間で高スループットが必要な場合(gRPC を使用)、標準的な Web API が必要な場合(REST を使用)。

JSON-RPC 2.0 のパターンについては、[skill:dotnet-realtime-communication] を参照してください。

REST(HTTP API)

最適な用途: 公開 API、標準的な CRUD 操作、幅広いクライアントとの互換性。

  • あらゆる HTTP クライアントで利用できる、普遍的なクライアントサポート
  • 人間が読みやすいペイロード(JSON)
  • 豊富なエコシステム(OpenAPI、Swagger UI、API バージョニング)
  • ステートレスなリクエスト/レスポンスモデル
  • ASP.NET Core Minimal API または MVC コントローラー

使用すべきでない場合: リアルタイムのプッシュが必要な場合(SSE または SignalR を使用)、サービス間で高スループットが必要な場合(gRPC を使用)、双方向ストリーミングが必要な場合(SignalR または gRPC を使用)。

HTTP クライアントのパターン、回復性、IHttpClientFactory については、[skill:dotnet-http-client] を参照してください。


一般的なアーキテクチャパターン

複数のプロトコルを組み合わせた API ゲートウェイ
Browser ─── REST/SignalR ──→ API Gateway ──→ gRPC ──→ Internal Services
                                          ──→ gRPC ──→ Order Service
                                          ──→ gRPC ──→ Inventory Service

公開 API には REST を使用し、ブラウザーのリアルタイム機能には SignalR を使用します。内部のサービス間通信には、パフォーマンス向上のため gRPC を使用します。API ゲートウェイがプロトコル間の変換を行います。

SSE を使用したイベント駆動型アーキテクチャ
Internal Services ──→ Message Broker ──→ SSE Endpoint ──→ Browser Dashboard
                                     ──→ gRPC Stream  ──→ Monitoring Service

内部イベントはメッセージブローカーを通じて流れます。ブラウザーのダッシュボードは SSE 経由でイベントを受信します。他のサービスは、より高いスループットを得るために gRPC ストリーミング経由でイベントを受信します。

複数プロトコル対応サービス

単一の ASP.NET Core ホストで、gRPC と REST の両方を提供できます。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddControllers();

var app = builder.Build();

// gRPC for internal service-to-service
app.MapGrpcService<OrderGrpcService>();

// REST for external clients
app.MapControllers();

// SSE for real-time browser updates
app.MapGet("/events/orders", (OrderEventService svc, CancellationToken ct) =>
    TypedResults.ServerSentEvents(svc.GetEventsAsync(ct)));

重要な原則

  • サービス間通信には gRPC を使用する -- 最高のスループット、強い型付けのコントラクト、あらゆるストリーミングパターンを提供します
  • 公開 API には REST を使用する -- 普遍的なクライアントサポート、人間が読みやすい形式、豊富なツールエコシステムが利用できます
  • ブラウザーのリアルタイム通信には SignalR を使用する -- トランスポートの自動ネゴシエーションと組み込みのグループ管理に対応しています
  • シンプルなサーバープッシュには SSE を使用する -- 双方向通信が不要な場合に最も軽量な選択肢です
  • 適切にプロトコルを組み合わせる -- 単一の ASP.NET Core ホストで、gRPC、REST、SignalR、SSE を同時に提供できます
  • クライアントの種類に応じてルーティングする -- ブラウザークライアントには REST/SignalR/SSE を、内部サービスには gRPC を使用します

AOT コンパイルパイプラインについては、[skill:dotnet-native-aot] を参照してください。また、AOT 互換の通信パターンについては、[skill:dotnet-aot-architecture] を参照してください。


エージェントに関する注意点

  1. ブラウザー向け API では、デフォルトで gRPC を選ばないでください -- ブラウザーは HTTP/2 トレーラーをネイティブに扱えません。プロキシと gRPC-Web を使用するか、REST/SignalR/SSE を選択してください。
  2. サービス間通信に SignalR を使用しないでください -- gRPC はバックエンド通信において、より高いパフォーマンス、コード生成、ストリーミングを提供します。
  3. SSE で十分な場合は SignalR を追加しないでください -- サーバーからクライアントへのプッシュだけが必要であれば、SSE のほうがシンプルで、クライアントライブラリが不要なうえ、ブラウザーに自動再接続機能が組み込まれています。
  4. 高スループットの内部通信に REST を使用しないでください -- JSON テキストのシリアル化とリクエストごとの接続により、gRPC のバイナリ形式と永続的な HTTP/2 接続に比べてオーバーヘッドが増加します。
  5. AOT に関する考慮事項を忘れないでください -- System.Text.Json を使用する REST エンドポイントでは、AOT のためにソース生成されたコンテキストが必要です。詳しくは [skill:dotnet-serialization] を参照してください。
  6. gRPC-Web を使わずに、信頼できないクライアントへ gRPC サービスを公開しないでください -- 生の gRPC には HTTP/2 が必要ですが、一部のプロキシや古いブラウザーなど、すべての環境で利用できるとは限りません。

参考資料

コメント