このページでは、Goa のサービスとメソッドがどのトランスポートの組み合わせを公開できるか、また各トランスポートで有効なストリーミングモードが何かを説明します。Goa における「トランスポートの混在」の意味と、許可/禁止の組み合わせをわかりやすくまとめたリファレンスです。
内容:
Result
と StreamingResult
を異なる型で両方定義。通常レスポンスとストリーミングレスポンスの切り替え(SSE のみ対応)を可能にします。次の表において「yes」は同一 Goa サービス内で共存可能であることを示します。注記に制約を示します。
同一サービス内のトランスポート | HTTP(通常) | HTTP(WS) | HTTP(SSE) | JSON‑RPC(HTTP) | JSON‑RPC(WS) | JSON‑RPC(SSE) | gRPC |
---|---|---|---|---|---|---|---|
HTTP(通常) | — | yes | yes | yes | no [S2] | yes | yes |
HTTP(WebSocket) | yes | — | yes | yes | no [S2] | yes | yes |
HTTP(SSE) | yes | yes | — | yes | no [S2] | yes | yes |
JSON‑RPC(HTTP) | yes | yes | yes | — | no [S1] | yes | yes |
JSON‑RPC(WebSocket) | no [S2] | no [S2] | no [S2] | no [S1] | — | no [S1] | yes |
JSON‑RPC(SSE) | yes | yes | yes | yes | no [S1] | — | yes |
gRPC | yes | yes | yes | yes | yes | yes | — |
注記:
補足(サービスレベル):
Accept
ヘッダー(text/event-stream
/ application/json
)で切り替えます。次の表において「yes」はそのトランスポート上でメソッドに対して有効であることを示します。「yes(mixed)」は混在結果(Result
と StreamingResult
が異なる型)かつ SSE 有効時に有効です。「no」は禁止です。
トランスポート | 非ストリーム | クライアント | サーバー | 双方向 |
---|---|---|---|---|
HTTP(通常) | yes | no | yes(mixed)[M1] | no |
HTTP(SSE) | yes(mixed)[M2] | no | yes [M3] | no |
HTTP(WebSocket) | no | yes [M4] | yes [M4] | yes [M4] |
JSON‑RPC(HTTP) | yes | no | yes(mixed)[M1,M5] | no |
JSON‑RPC(SSE) | yes(mixed)[M2,M5] | no | yes [M6] | no |
JSON‑RPC(WebSocket) | no | yes [M7] | yes [M8] | yes [M7] |
gRPC | yes | yes | yes | yes |
注記:
StreamingPayload
は不可。通常レスポンスと SSE ストリームのコンテンツネゴシエーションに利用します。Accept
で切り替えます。id
は結果の ID 属性に対応します。Payload
に定義し、StreamingPayload
を併用しないでください。WebSocket:
StreamingPayload()
のみ(クライアント→サーバー通知)。StreamingResult()
のみ(サーバー→クライアント通知、id
なし)。HTTP と SSE:
Accept
に基づき動作を選択。ID 取り扱い:
id
を結果の ID
フィールドへコピー(未設定時)。id
を再利用。サーバー発通知は id
なし。SendAndClose
は JSON‑RPC 応答を送出。id
は結果の ID があればそれを、なければ要求 id
。gRPC は Goa における HTTP/JSON‑RPC との組み合わせに追加制約はありません。ユニタリ、クライアントストリーム、サーバーストリーム、双方向の全てに対応し、他トランスポートと自由に併用可能です。
expr/method.go
: ストリーム種別のヘルパー、混在結果の検出。dsl/payload.go
, dsl/result.go
: StreamingPayload
/StreamingResult
によるストリーム種別の設定。expr/http_endpoint.go
: SSE の制約、混在結果の要件、純粋 HTTP WS の検証、JSON‑RPC エンドポイントの検証。expr/http_service.go
: JSON‑RPC の混在ルール、JSON‑RPC WS と純粋 HTTP WS の衝突、JSON‑RPC ルートの準備とメソッド制約(WS は GET、その他は POST)。dsl/jsonrpc.go
, jsonrpc/README.md
: JSON‑RPC のトランスポート動作(バッチ、通知、WS/SSE のセマンティクス)、WS にはストリーミング必須/HTTP+SSE のコンテンツネゴシエーション。// JSON‑RPC SSE + HTTP(混在結果)
Method("monitor", func() {
Result(ResultType)
StreamingResult(EventType)
JSONRPC(func() { ServerSentEvents() })
})
// JSON‑RPC WebSocket(双方向)
Method("chat", func() {
StreamingPayload(Message)
StreamingResult(Message)
JSONRPC(func() {})
})
// 純粋 HTTP SSE(サーバーストリーム)
Method("watch", func() {
StreamingResult(Event)
HTTP(func() { ServerSentEvents() })
})
上記の例をテンプレートとして、表の制約に従ってサービス/メソッドの組み合わせを選択してください。