1. #TecHeroes loves GameDev Tour
Game Matching with SignalR
Nicolò Carandini [MVP]
n.carandini@outlook.com
@TPCWare
2. 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
3. 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
4. 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:
5. 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
6. 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
7. 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
8. 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.
9. 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
10. 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
11. 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
12. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Diagramma architetturale di SignalR
13. 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)
14. 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
15. 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
16. 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.
17. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Visual Studio Browser Link
18. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Real Time Game: ShootR
20. 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)
23. 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!
24. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Next version: ASP.NET Core SignalR
25. 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
26. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Game Player Use Case diagram
27. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Activity diagram
28. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Sequence diagram
29. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Activity diagram
30. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Sequence diagram
31. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Game Matching
32. 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
33. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Estimate Your Monthly Bill
34. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Question Time…