Komunikacja w czasie rzeczywistym w Delphi — Wybierz swój protokół

WebSocket, Server-Sent Events, HTTP/2 server push, MQTT, AMQP i WebRTC wszystkie rozwiązują „pchnij klienta, gdy coś się stanie”. Mają radykalnie różne profile operacyjne — ta strona to ściągawka do wyboru właściwego.

Jedna biblioteka, sześć protokołów czasu rzeczywistego

sgcWebSockets dostarcza każdego głównego klienta i serwer czasu rzeczywistego Delphi w pakiecie — więc pytanie przestaje być „czy mogę to zrobić w Pascalu?” i staje się „który protokół pasuje do zadania?”

Komunikacja w czasie rzeczywistym w Delphi” to termin parasolowy — w praktyce pokrywa sześć fundamentalnie różnych prymitywów sieciowych, każdy z innymi właściwościami latencji, kolejności, fan-outu, traversal NAT i infrastruktury. Wybranie źle kosztuje miesiące: dostarczasz pętlę polling REST, trafiasz na sufity skalowalności, retrofituje warstwę WebSocket, potem odkrywasz, że MQTT byłby lepszym dopasowaniem, bo Twój ruch jest fundamentalnie pub/sub. Ta strona to krótki, opiniotwórczy przewodnik.

Który protokół — w jednej tabeli

Skanuj wiersze; kolumna z najwięcej zieleni wygrywa.

Potrzeba WebSocket SSE HTTP/2 push MQTT AMQP WebRTC
DwukierunkowyTakNie (tylko serwer→klient)NieTak (pub/sub)Tak (pub/sub)Tak (peer)
Rozgłaszanie fan-outImplementowane przez serwerTylko per-klientTylko per-strumieńNatywne (topics)Natywne (exchanges)Nie (1:1)
Wspierany przez przeglądarkęTakTakTakPrzez WebSocketPrzez WebSocketTak
Przez firmowe proxyPrzez wss://443Tak (wygląda jak HTTP)TakPrzez WSSPrzez WSSCzęsto (TURN)
Gwarantowane dostarczeniePoziom aplikacjiPoziom aplikacjiPoziom aplikacjiQoS 1/2Ack’dSCTP niezawodne
Urządzenia o niskiej przepustowościŚrednieNiskaŚredniaDoskonałeŚrednieŚrednie
P2P / traversal NATNie (serwer)NieNieNie (broker)Nie (broker)Tak (ICE)
Szyfrowanie end-to-endTLS hop-by-hopTLS hop-by-hopTLS hop-by-hopTLS hop-by-hopTLS hop-by-hopDTLS-SRTP E2E
Serwer może działać w DelphiTakTakTakUżyj zewnętrznego brokeraUżyj zewnętrznego brokeraTak (sygnalizacja + STUN/TURN)

Krótka wersja

WebSocket

Domyślny wybór. Dwukierunkowy, niski narzut, działa w każdej przeglądarce. Wybierz dla pulpitów na żywo, czatu, kolaboracyjnej edycji, niestandardowych protokołów aplikacji. Komponent →

Server-Sent Events

Wybierz, gdy ruch jest tylko serwer → klient i chcesz najprostszego możliwego modelu: długotrwała odpowiedź HTTP strumieniująca tekst. Wbudowane w każdą przeglądarkę bez biblioteki. SSE →

HTTP/2 push

Użyj, by prewencyjnie wysłać subzasoby (CSS, JS, JSON) obok głównego dokumentu — tnie round-trip. Nie ogólny kanał „push”. HTTP/2 →

MQTT

Pub/sub dla IoT, telemetrii, obecności mobilnej, pojazdów połączonych. QoS 1/2, retained messages, last-will, mały narzut wire. Potrzebuje brokera. MQTT →

AMQP

Komunikaty przedsiębiorstwa: trwałe kolejki, exchanges, klucze routingu, obsługa dead-letter, RabbitMQ / Azure Service Bus / IBM MQ. Wybierz zamiast MQTT, gdy potrzebujesz bogatego routingu. AMQP →

WebRTC

Bezpośrednie peer-to-peer z traversal NAT — kanały danych dla kolaboracji, ewentualnie audio/video. Jedyna opcja dla E2E-szyfrowanego P2P. WebRTC →

Jak każdy z nich wygląda

Minimalny opłacalny fragment Delphi do połączenia z każdym protokołem — ta sama biblioteka, ten sam wzorzec komponentu.

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');

Multipleksowane GET HTTP/2

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]));

Kanał danych 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;

Trzy błędy warte uniknięcia

Polling REST w pętli

Jeśli przyłapiesz się na wywoływaniu Get co dwie sekundy i diff odpowiedzi, odpowiedzią prawie zawsze jest SSE (tylko serwer→klient) lub WebSocket (dwukierunkowy). Oszczędności CPU i pasma to rutynowo 95 %+.

Wybór WebSocket, gdy pasuje MQTT

Jeśli Twój ruch jest fundamentalnie fan-out oparty na tematach (urządzenia publikujące telemetrię, pulpity subskrybujące), uruchamianie niestandardowego protokołu JSON-over-WebSocket implementuje MQTT źle. Użyj brokera.

Mylenie HTTP/2 push z server push

HTTP/2 push promise to optymalizacja subzasobu, nie ogólny kanał push. Dla długotrwałych strumieni serwer-do-klienta nadal chcesz SSE, WebSocket lub MQTT.

Eksploruj każdy protokół

Klient MQTT dla Delphi

Pub/sub IoT i telemetrii.

Klient HTTP/2 dla Delphi

Multipleksowane HTTP i push.

Biblioteka WebRTC dla Delphi

Kanały danych peer-to-peer.

Server-Sent Events

Proste strumieniowanie serwer→klient.

AMQP

Komunikaty przedsiębiorstwa przez RabbitMQ, Service Bus, IBM MQ.

Blog: Przewodnik klienta SSE

Praktyczny przykład SSE.

Blog: Load-balancing czasu rzeczywistego

Jak postawić nginx / Envoy / ALB przed WebSocket i HTTP/2.

Wypróbuj każdy protokół z jednego instalatora

Pobierz wersję próbną — dema dla WebSocket, SSE, MQTT, AMQP, HTTP/2 i WebRTC są wszystkie dostarczane w pakiecie.