#TecHeroes loves GameDev Tour
Game Matching with SignalR
Nicolò Carandini [MVP]
n.carandini@outlook.com
@TPCWare
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Agenda
• SignalR
• Comunicare in Real Time
• HTTP & HTLM5 / WebSockets
• ASP.NET SignalR
• Casi d’uso
• Demo
• Game Matching
• Un po’ di teoria
• Demo
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Comunicazione full duplex con HTTP ?
Il protocollo HTTP prevede che il Client faccia una richiesta e il Server dia una
risposta. Il Server non ha modo di mandare un messaggio al Client di sua
iniziativa.
INTERNET
REQUEST
INTERNET
RESPONSE
<HTML> Page
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Comunicazione real time tra clienti
Se voglio comunicare tra vari client, quando il server riceve dati da
un client, deve poter inviare dati agli altri client:
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Possibili soluzioni
Polling
Long Polling
SERVER
CLIENT
tempo
Request
Response
Request
Response
Request
Response
Request
Response
Request
Response
Intervallo di polling Intervallo di polling Intervallo di polling Intervallo di polling
SERVER
CLIENT
tempo
Request
Response
Request
Response
Request
Response
Response
Request
Request
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Controindicazioni?
• Polling:
Se l’intervallo è breve, troppe richieste inutili
Se l’intervallo è lungo, le informazioni arrivano in ritardo
• Long polling:
Il Server deve gestire le richieste in modo asincrono
altrimenti va in saturazione e non accetta altre richieste
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
HTLM5/WebSockets
• Fanno parte delle specifiche di HTML5
• Estendono il protocollo HTTP fornendo il supporto alle raw sockets
• Consentono la comunicazione full-duplex
• Traversano gli HTTP proxies (solo se i proxies sono "moderni"…)
Client Proxy Server / Firewall Origin Server
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Tutto risolto?
Non proprio, perché HTML5/WebSocket è un protocollo di basso livello che
richiede la scrittura di molto codice per implementare le funzionalità richieste da
una applicazione real-time.
Inoltre le condizioni d’uso delle WebSockets sono molto restrittive.
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Condizioni d’uso delle WebSockets
Funzionano quando:
• Il Web Server le supporta
• Il Web browser le supporta
• Il load balancer/reverse proxy le supporta
• Il client proxy server/NAT le supporta
• Tutto ciò che sta tra il client e il server le supporta
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
ASP.NET SignalR
SignalR è la libreria ASP.NET che rende incredibilmente semplice aggiungere
funzionalità Real-Time alle applicazioni web
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Punti di forza
• Implementa, ove possibile, WebSockets.
• Fa il downgrade in modo trasparente alle altre tecniche di polling
• Fornisce una API di alto livello, molto semplice da usare, per fare
RPC tra server e client
• Offre funzionalità di gestione degli eventi di connessione e
sconnessione e la gestione delle autorizzazioni
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Diagramma architetturale di SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
SignalR API
PersistentConnection
• Implementa le funzionalità minime necessarie
• Consente l’invio e la ricezione di stringhe
• Broadcast a tutti, a gruppi o a singoli utenti
• Connessione, riconnessione e disconnessione
Hub
• Utilizza la PersistentConnection
• Consente l’uso delle RPC da client a server e viceversa
• Genera automaticamente i proxy RPC per i web client (in JavaScript)
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
PersistentConnection Vs. Hub
Nella maggior parte dei casi si usa l’Hub.
La PersistentConnection viene utilizzata nei seguenti casi:
• Si usa un messaggio con formato custom
• Si preferisce lavorare tramite invio di messaggi invece di utilizzare
RPC (remote Procedure Call)
• Occorre fare il porting a SignalR di un’applicazione preesistente che
è basta sull’invio di messaggi e non usa le RPC
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
RPC (Remote Procedure Call)
Si possono chiamare funzioni JavaScript lato client da codice .NET
lato server, e viceversa
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Per fare cosa?
Oltre ai classici scenari di chat, SignalR è perfetto per tutti
quei casi in cui si abbia necessità di update ad alta
frequenza, come nei giochi in real-time o implementare
funzionalità di comunicazione full duplex all’interno di un
applicativo.
Interessante notare che Visual Studio (sin dalla versione
2013) usa SignalR per implementare la funzionalità di
Browser Link.
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Visual Studio Browser Link
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Real Time Game: ShootR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
ShootR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Performances
Throughtput
• Un singolo server riesce a gestire da 100.000 a 500.000 messaggi al
secondo.
• Con un’occupazione di memoria estremamente ridotta.
Scalabilità
• Fully async
• Circa 1.000 connessioni per server
• Supporta la scalabilità orizzontale utilizzando un message bus
(Service Bus, Redis, SQL)
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Scalabilità
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Client disponibili
• JavaScript(jQuery)
• .NET 4.x
• Xamarin
• UWP
• iOS
• Android
• Java
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Next version: ASP.NET Core SignalR
• Ancora in fase di sviluppo
• Beta prevista per metà anno, RTM per fine anno
• Tra le tante novità:
• L’indipendenza da jQuery per il client Javascript
• Invio/ricezione anche di binary data
• Supporto di protocolli/formati multipli
• Supporto di clienti WebSocket "puri"
…e tanto altro ancora!
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Next version: ASP.NET Core SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Riferimenti
ASP.NET SignalR 2.0
http://www.asp.net/signalr
https://github.com/SignalR/SignalR
ASP.NET Core SignalR
https://blog.3d-logic.com/2017/01/15/signalr-core-part-13-design-considerations
https://speakerdeck.com/davidfowl/introducing-asp-dot-net-core-sockets
https://github.com/aspnet/SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Game Player Use Case diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Activity diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Sequence diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Activity diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Sequence diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Game Matching
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Game Matching per Unity
• Poiché il game matching è piuttosto oneroso da sviluppare, per chi
sviluppa giochi con Unity può essere (molto) conveniente utilizzare
un servizio a pagamento come Unity Multiplayer:
• Gratuito fino a 20 giocatori contemporaneamente in gioco
• Con pagamento mensile in base al traffico prodotto
• Per una stima dei costi mensili, basta andare sul sito di Unity:
• https://unity3d.com/services/multiplayer
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Estimate Your Monthly Bill
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Question Time…

Game matching with SignalR

  • 1.
    #TecHeroes loves GameDevTour Game Matching with SignalR Nicolò Carandini [MVP] n.carandini@outlook.com @TPCWare
  • 2.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Agenda • SignalR • Comunicare in Real Time • HTTP & HTLM5 / WebSockets • ASP.NET SignalR • Casi d’uso • Demo • Game Matching • Un po’ di teoria • Demo
  • 3.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Comunicazione full duplex con HTTP ? Il protocollo HTTP prevede che il Client faccia una richiesta e il Server dia una risposta. Il Server non ha modo di mandare un messaggio al Client di sua iniziativa. INTERNET REQUEST INTERNET RESPONSE <HTML> Page
  • 4.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Comunicazione real time tra clienti Se voglio comunicare tra vari client, quando il server riceve dati da un client, deve poter inviare dati agli altri client:
  • 5.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Possibili soluzioni Polling Long Polling SERVER CLIENT tempo Request Response Request Response Request Response Request Response Request Response Intervallo di polling Intervallo di polling Intervallo di polling Intervallo di polling SERVER CLIENT tempo Request Response Request Response Request Response Response Request Request
  • 6.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Controindicazioni? • Polling: Se l’intervallo è breve, troppe richieste inutili Se l’intervallo è lungo, le informazioni arrivano in ritardo • Long polling: Il Server deve gestire le richieste in modo asincrono altrimenti va in saturazione e non accetta altre richieste
  • 7.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour HTLM5/WebSockets • Fanno parte delle specifiche di HTML5 • Estendono il protocollo HTTP fornendo il supporto alle raw sockets • Consentono la comunicazione full-duplex • Traversano gli HTTP proxies (solo se i proxies sono "moderni"…) Client Proxy Server / Firewall Origin Server
  • 8.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Tutto risolto? Non proprio, perché HTML5/WebSocket è un protocollo di basso livello che richiede la scrittura di molto codice per implementare le funzionalità richieste da una applicazione real-time. Inoltre le condizioni d’uso delle WebSockets sono molto restrittive.
  • 9.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Condizioni d’uso delle WebSockets Funzionano quando: • Il Web Server le supporta • Il Web browser le supporta • Il load balancer/reverse proxy le supporta • Il client proxy server/NAT le supporta • Tutto ciò che sta tra il client e il server le supporta
  • 10.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour ASP.NET SignalR SignalR è la libreria ASP.NET che rende incredibilmente semplice aggiungere funzionalità Real-Time alle applicazioni web
  • 11.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Punti di forza • Implementa, ove possibile, WebSockets. • Fa il downgrade in modo trasparente alle altre tecniche di polling • Fornisce una API di alto livello, molto semplice da usare, per fare RPC tra server e client • Offre funzionalità di gestione degli eventi di connessione e sconnessione e la gestione delle autorizzazioni
  • 12.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Diagramma architetturale di SignalR
  • 13.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour SignalR API PersistentConnection • Implementa le funzionalità minime necessarie • Consente l’invio e la ricezione di stringhe • Broadcast a tutti, a gruppi o a singoli utenti • Connessione, riconnessione e disconnessione Hub • Utilizza la PersistentConnection • Consente l’uso delle RPC da client a server e viceversa • Genera automaticamente i proxy RPC per i web client (in JavaScript)
  • 14.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour PersistentConnection Vs. Hub Nella maggior parte dei casi si usa l’Hub. La PersistentConnection viene utilizzata nei seguenti casi: • Si usa un messaggio con formato custom • Si preferisce lavorare tramite invio di messaggi invece di utilizzare RPC (remote Procedure Call) • Occorre fare il porting a SignalR di un’applicazione preesistente che è basta sull’invio di messaggi e non usa le RPC
  • 15.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour RPC (Remote Procedure Call) Si possono chiamare funzioni JavaScript lato client da codice .NET lato server, e viceversa
  • 16.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Per fare cosa? Oltre ai classici scenari di chat, SignalR è perfetto per tutti quei casi in cui si abbia necessità di update ad alta frequenza, come nei giochi in real-time o implementare funzionalità di comunicazione full duplex all’interno di un applicativo. Interessante notare che Visual Studio (sin dalla versione 2013) usa SignalR per implementare la funzionalità di Browser Link.
  • 17.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Visual Studio Browser Link
  • 18.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Real Time Game: ShootR
  • 19.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Demo ShootR
  • 20.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Performances Throughtput • Un singolo server riesce a gestire da 100.000 a 500.000 messaggi al secondo. • Con un’occupazione di memoria estremamente ridotta. Scalabilità • Fully async • Circa 1.000 connessioni per server • Supporta la scalabilità orizzontale utilizzando un message bus (Service Bus, Redis, SQL)
  • 21.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Scalabilità
  • 22.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Client disponibili • JavaScript(jQuery) • .NET 4.x • Xamarin • UWP • iOS • Android • Java
  • 23.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Next version: ASP.NET Core SignalR • Ancora in fase di sviluppo • Beta prevista per metà anno, RTM per fine anno • Tra le tante novità: • L’indipendenza da jQuery per il client Javascript • Invio/ricezione anche di binary data • Supporto di protocolli/formati multipli • Supporto di clienti WebSocket "puri" …e tanto altro ancora!
  • 24.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Next version: ASP.NET Core SignalR
  • 25.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Riferimenti ASP.NET SignalR 2.0 http://www.asp.net/signalr https://github.com/SignalR/SignalR ASP.NET Core SignalR https://blog.3d-logic.com/2017/01/15/signalr-core-part-13-design-considerations https://speakerdeck.com/davidfowl/introducing-asp-dot-net-core-sockets https://github.com/aspnet/SignalR
  • 26.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Game Player Use Case diagram
  • 27.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Match Making Activity diagram
  • 28.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Match Making Sequence diagram
  • 29.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Play Turn Activity diagram
  • 30.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Play Turn Sequence diagram
  • 31.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Demo Game Matching
  • 32.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Game Matching per Unity • Poiché il game matching è piuttosto oneroso da sviluppare, per chi sviluppa giochi con Unity può essere (molto) conveniente utilizzare un servizio a pagamento come Unity Multiplayer: • Gratuito fino a 20 giocatori contemporaneamente in gioco • Con pagamento mensile in base al traffico prodotto • Per una stima dei costi mensili, basta andare sul sito di Unity: • https://unity3d.com/services/multiplayer
  • 33.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Demo Estimate Your Monthly Bill
  • 34.
    Roma, 27 Gennaio2017#TecHeroes loves GameDev Tour Question Time…