2015-12-01 22 views
6

HTTP/2 introduce alcune caratteristiche molto interessanti come pipeline, multiplexing e promesse push server; che da soli sono fantastici. In cambio, abbiamo sacrificato WebSockets.Utilizzo di una singola connessione HTTP/2 per comunicazioni bidirezionali (e simmetriche)

In teoria HTTP/2 consente la comunicazione bidirezionale tra server e client sotto forma di promesse push. Il server può inviare risposte al client prima ancora di essere richiesto. Ancora; eccezionale. Queste richieste però sono diverse dalle richieste del cliente.

Quindi la domanda a portata di mano:
C'è un modo per avere una singola/2 connessione HTTP che permette sia server che client di inviare messaggi arbitrari (punti extra per quelli binari) l'uno all'altro senza dover definire un protocollo diverso per il client inviato messaggi e server inviato messaggi?

WebSockets sono un ottimo esempio di ciò che sto cercando in quanto una delle due parti può avviare la connessione e quindi entrambi possono inviare messaggi.

Una soluzione che non interrompe HTTP/2 sarebbe l'ideale, ma l'abuso di protocollo è anche il benvenuto.
Grazie mille in anticipo.

ps. L'obiettivo di questo esercizio è capire se un protocollo di trasporto come GRPC, Thrift, ecc. Può essere progettato su HTTP/2 senza un'architettura server/client, ma dove entrambe le parti possono inviare e ricevere messaggi, quindi funzionalità come req/resp, pub/sub, rpc, ecc possono essere costruiti sopra.

+0

grpc utilizza http2 per impostazione predefinita. http://www.grpc.io/docs/guides/wire.html – nibin012

risposta

5

In questo momento la cosa più vicina a ciò che desideri sono gli eventi inviati dal server. Dovrebbe funzionare bene con HTTP/2 ed è supportato da tutti i browser ad eccezione di IE abituale, ma è disponibile un polyfill (che mangerà la RAM). Nessun supporto binario senza un qualche tipo di escape, dal momento che i newline vengono utilizzati per separare parti e messaggi dei messaggi stessi.

Ancora qualche nota (correzioni benvenuto):

  • WebSockets sta bene e calci. HTTP/2 Connect dovrebbe essere utile nel prossimo futuro, se non lo è ora.
  • ma i server non possono avviare websocket al client.
  • Le promesse push hanno uno scopo molto diverso, no, non è possibile utilizzarle al posto delle web socket.

HTTP/2 push è chiamato push, ma non ha nulla a che fare con le notifiche inviate dal server. È solo un modo più o meno sensato di ridurre il tempo di caricamento delle applicazioni risparmiando round-trip.

+0

Server Side Events sembra davvero la risposta più appropriata alla mia domanda. Un esempio di golang molto interessante può essere trovato qui https://www.new-bamboo.co.uk/blog/2014/05/13/writing-a-server-sent-events-server-in-go/ –

+0

Grazie per condividere eccellenti informazioni. Ho avuto la stessa confusione con le spinte HTTP2. – lithiumlab

+0

È necessario quindi costruire un framework su HTTP/2 full duplex per simulare WebSockets con esso? – FrickeFresh