Delphi でのリアルタイム通信 — プロトコルを選ぶ

WebSocket、Server-Sent Events、HTTP/2 サーバープッシュ、MQTT、AMQP、WebRTC はすべて「何かが起きたらクライアントにプッシュする」を解決します。運用プロファイルが根本的に異なります — このページは正しいものを選ぶためのチートシートです。

1 つのライブラリ、6 つのリアルタイムプロトコル

sgcWebSockets はすべての主流 Delphi リアルタイムクライアントとサーバーを箱に同梱します — だから問いは「これは Pascal で可能か?」ではなく「どのプロトコルが仕事に合うか?」になります。

Delphi でのリアルタイム通信」は包括的な用語です — 実用上 6 つの根本的に異なるネットワークプリミティブをカバーし、それぞれがレイテンシ、順序付け、ファンアウト、NAT 越え、インフラストラクチャの特性が異なります。誤った選択は数か月を浪費します: ポーリング REST ループを出荷し、スケーラビリティ上限に達し、WebSocket 層を後付けし、その後トラフィックが本質的に pub/sub であるため MQTT の方が適合したと発見する。このページは短く意見ある案内です。

どのプロトコル — 1 つの表で

行をスキャン; 最も多くの「あり」を持つ列が勝ち。

必要なもの WebSocket SSE HTTP/2 push MQTT AMQP WebRTC
双方向ありなし(サーバー→クライアントのみ)なしあり(pub/sub)あり(pub/sub)あり(ピア)
ファンアウトブロードキャストサーバー実装クライアントごとのみストリームごとのみネイティブ(トピック)ネイティブ(エクスチェンジ)なし(1:1)
ブラウザサポートありありありWebSocket 経由WebSocket 経由あり
企業プロキシ越しwss://443 経由あり(HTTP に見える)ありWSS 経由WSS 経由多く(TURN)
保証された配信アプリレベルアプリレベルアプリレベルQoS 1/2Ack 付きSCTP 信頼性
低帯域デバイス優秀
P2P / NAT 越えなし(サーバー)なしなしなし(ブローカー)なし(ブローカー)あり(ICE)
エンド・ツー・エンド暗号化TLS ホップごとTLS ホップごとTLS ホップごとTLS ホップごとTLS ホップごとDTLS-SRTP E2E
サーバーを Delphi で実行可ありありあり外部ブローカー使用外部ブローカー使用あり(シグナリング + STUN/TURN)

短いバージョン

WebSocket

デフォルトの選択。双方向、低オーバーヘッド、すべてのブラウザで動作。ライブダッシュボード、チャット、共同編集、カスタムアプリケーションプロトコルに選んでください。コンポーネント →

Server-Sent Events

トラフィックがサーバー → クライアントのみで、最も単純なモデルが欲しいときに選んでください: テキストをストリームする長寿命の HTTP レスポンス。ライブラリなしですべてのブラウザに組み込まれています。SSE →

HTTP/2 push

サブリソース(CSS、JS、JSON)をメインドキュメントと並行して先取り送信するために使用 — ラウンドトリップをカット。汎用的な「プッシュ」チャネルではありません。HTTP/2 →

MQTT

IoT、テレメトリ、モバイルプレゼンス、コネクテッドビークルの pub/sub。QoS 1/2、retained メッセージ、last-will、小さなワイヤーオーバーヘッド。ブローカーが必要。MQTT →

AMQP

エンタープライズメッセージング: 永続キュー、エクスチェンジ、ルーティングキー、dead-letter ハンドリング、RabbitMQ / Azure Service Bus / IBM MQ。リッチなルーティングが必要なら MQTT より優先。AMQP →

WebRTC

NAT 越え付きの直接ピア・ツー・ピア — 共同作業のためのデータチャネル、最終的にはオーディオ/ビデオ。E2E 暗号化 P2P の唯一の選択肢。WebRTC →

それぞれがどう見えるか

各プロトコルに接続する最小限の Delphi スニペット — 同じライブラリ、同じコンポーネントパターン。

WebSocket

WS := TsgcWebSocketClient.Create(nil);
WS.URL := 'wss://echo.websocket.events';
WS.OnMessage := DoMessage;
WS.Active := True;
WS.WriteData('hello');

Server-Sent Events

SSE := TsgcWSPClient_SSE.Create(nil);
SSE.URL := 'https://stream.example.com/events';
SSE.OnEvent := DoEvent;
SSE.Active := True;

MQTT

MQTT := TsgcWSPClient_MQTT.Create(nil);
MQTT.Client := WSClient;
MQTT.OnMQTTPublish := DoMqttPublish;
WSClient.Active := True;
MQTT.Subscribe('sensors/+/temperature', mtqsAtLeastOnce);

AMQP

AMQP := TsgcWSPClient_AMQP.Create(nil);
AMQP.Client := WSClient;
AMQP.OnAMQPMessage := DoAmqpMessage;
WSClient.Active := True;
AMQP.Consume('orders');

HTTP/2 多重化 GET

H2 := TsgcHTTP2Client.Create(nil);
H2.Host := 'api.example.com';
H2.Port := 443;
H2.TLS  := True;
H2.OnResponse := DoResponse;
H2.Connect;
for i := 1 to 10 do H2.Get(Format('/items/%d', [i]));

WebRTC データチャネル

RTC := TsgcWSPClient_WebRTC.Create(nil);
RTC.Client := WSSignal;
RTC.IceServers.Add.URL := 'stun:stun.l.google.com:19302';
RTC.OnDataChannelMessage := DoP2PMessage;
WSSignal.Active := True;
RTC.CreateDataChannel('chat', True, True);
RTC.CreateOffer;

避ける価値のある 3 つの間違い

ループで REST をポーリング

2 秒ごとに Get を呼び出してレスポンスを diff している自分に気づいたら、答えはほぼ常に SSE(サーバー→クライアントのみ)または WebSocket(双方向)です。CPU と帯域の節約は通常 95 % 以上です。

MQTT が適合するときに WebSocket を選ぶ

トラフィックが本質的にトピックベースのファンアウト(デバイスがテレメトリを発行、ダッシュボードが購読)なら、カスタム JSON-over-WebSocket プロトコルを実行することは MQTT を不適切に再実装することです。ブローカーを使用してください。

HTTP/2 push をサーバープッシュと混同

HTTP/2 のpush promise はサブリソース最適化で、汎用プッシュチャネルではありません。長寿命のサーバー・ツー・クライアントストリームには SSE、WebSocket、MQTT が欲しいままです。

各プロトコルを探索

Delphi WebSocket コンポーネント

フラッグシップトランスポート。

Delphi MQTT クライアント

IoT とテレメトリの pub/sub。

Delphi HTTP/2 クライアント

多重化 HTTP とプッシュ。

Delphi WebRTC ライブラリ

ピア・ツー・ピアデータチャネル。

Server-Sent Events

シンプルなサーバー→クライアントストリーミング。

AMQP

RabbitMQ、Service Bus、IBM MQ 経由のエンタープライズメッセージング。

ブログ: リアルタイムのロードバランシング

nginx / Envoy / ALB を WebSocket と HTTP/2 の前に置く方法。

1 つのインストーラーからすべてのプロトコルを試す

トライアルをダウンロード — WebSocket、SSE、MQTT、AMQP、HTTP/2、WebRTC のデモがすべて箱に同梱。