Server Java ad alto carico per multigiocatore

4

Sto facendo un gioco multiplayer. Ora sto cercando di scegliere la tecnologia per connettere i dispositivi Android al server. I client funzionano su Android e il gioco è MMORPG. Mi piacerebbe scrivere il server in java. In questo momento ho solo 3 idee per questo:

1) creazione di un ambiente di multithreading con java e socket semplici. In questo modo sarà più semplice eseguire una connessione full-duplex tra il client di gioco e il server. Ma ho le seguenti preoccupazioni:

1.1) Il gioco è MMORPG con un gran numero di oggetti, e non sono sicuro di come tali soluzioni siano ridimensionate se ci sono ad esempio 5000 persone che giocano nello stesso momento. Quanti thread potrò eseguire su java Machine? Come posso calcolare approssimativamente questo? Nel caso in cui 1 thread stia leggendo per ogni socket e 1 thread sta scrivendo sul socket (quindi 2 thread per 1 player).

1.2) Quando il numero di giocatori cresce, come sarò in grado di scalare il mio archivio jar auto-scritto per distribuirlo su diversi server? Forse c'è qualche trucco speciale per farlo?

1.3) Molte API di overhead di programmazione sono piuttosto di basso livello.

2) Creazione di un'interfaccia servlet per servire le richieste HTTP.

2.1) Sessione di controllo facile (e autorizzazione) a condizione che ogni giocatore abbia la propria sessione.

2.2) può connettersi a EJB java di java o qualsiasi altra cosa - molte complicazioni con la programmazione a livello di sistema vengono eliminate. Quindi posso concentrarmi sulla scrittura della logica di business.

2.3) Può servire tutti i tipi di client con HTTP - dispositivi mobili + browser.

2.4) Alta velocità - anche 1 contenitore di servlet può servire qualche migliaio di richieste al secondo, quindi sarà molto veloce.

2.4) Ma questo approccio non può fornire una comunicazione full duplex. Dovrò inviare richieste ogni 1 secondo per verificare gli aggiornamenti. 1 secondo di ritardo non fa molta differenza per il gioco in quanto è a turni, ma genera comunque molto traffico. È fattibile quando ci sono molti giocatori che giocano? Ho sentito parlare della tecnologia COMET, ma sembra che se il server debba inviare molti messaggi in fila, dovrò comunque inviare richieste ogni volta + questa tecnologia non è ancora ben stabilita.

3) Creazione di socket e collegamento tramite JMS al server EE java.

3.1) Cool perché consente la comunicazione full duplex tra client e server + offre tutte le funzionalità interessanti di java EE. Più tardi può essere esteso al browser tramite l'interfaccia servlet.

3.2) Sembra una specie di overengineering. E 'davvero come la gente lo farebbe? Voglio dire è anche il modo corretto? Uno sviluppatore sane lo farebbe così?

Vorrei che mi aiutassi con la scelta, per favore. Non ho molta esperienza nel fare un lavoro del genere. E vorrebbe attenersi alle migliori pratiche.

    
posta John 12.06.2013 - 01:32
fonte

2 risposte

8

Perché riscrivere Cosa puoi ottenere dallo scaffale?

Perché non utilizzare RedDwarf Server (precedentemente Project DarkStar )?

RedDwarf Server is an open source middleware solution for developing the server-side of massively multiplayer online games. It is the official community fork of Project Darkstar, an open source project supported and managed by Sun Microsystems. - from RedDwarf's Wikipedia article

Il dominio di RedDwarf sembra inattivo oggi (2013-06-12), ma c'è ancora un wiki , e sono migrazione a un repository GitHub .

RedDward presenta la sua filosofia e i suoi obiettivi come:

  • Make server-side game code reliable, scalable, persistent, and fault-tolerant in a manner that is transparent to the game developer.
  • Present a simple single-threaded event-driven programming model to the developer. The developer should never have his or her code fail due to interactions between code handling different events. (from the RedDwarf Tutorial)

Non che ciò non significhi che il codice server sia a thread singolo, ma che sia astratto dal punto di vista dello sviluppatore del gioco. Il Tutorial RedDwarf fornisce molte più informazioni su cosa può RedDwarf fare e chiarire molte delle sue decisioni di progettazione.

Un punto di preoccupazione per te, tuttavia, era che la capacità multi-nodo non era stata completamente implementata l'ultima volta che ho controllato (circa 2011).

Da zero

Questo non dovrebbe impedirti di tentare di fare la maggior parte di queste cose da zero, se apprezzi l'esperienza di apprendimento. Tuttavia, questo è uno sforzo importante e richiederà molto tempo e, come avete notato nella vostra domanda, alcuni di questi problemi sono piuttosto di basso livello nello stack tecnologico da affrontare e aumenteranno notevolmente la complessità del codice che voi Dovrò mantenere.

Comunque, per quanto riguarda le tue 3 opzioni, la prima sembra la migliore per me, se dovessi fare un'implementazione fatta in casa. L'opzione 2 (che utilizza i servlet HTTP) sembra adattata solo per alcuni giochi, anche se suppongo che potrebbe essere un'alternativa relativamente buona per implementare qualcosa da te mentre si delegherà al middleware, e si potrebbero beneficiare di molte aggiunte del server Web per gestire il carico ( moduli cache, ecc ...). L'opzione 3 (che utilizza JMS + JEE) sembra davvero eccessivamente ingegnerizzata, ma è difficile saperlo con certezza senza sapere cosa hai in mente.

E se sei qui per cercare di imparare, allora ovviamente l'opzione 1 coprirà molto terreno. Ma sarà una battaglia piuttosto dura.

    
risposta data 12.06.2013 - 01:39
fonte
1

1.1) non puoi pensare in termini di thread per utente. A seconda della configurazione della macchina, ma è possibile caricare migliaia di thread ma non si ridimensionerà e perderà molto tempo nel contesto del thread. Meglio pensare a NIO Netty come un framework con pochi executor di pool Thread in entrata e in uscita che eseguono messaggi in entrata sotto millisecondi esecuzioni.

1.2) Puoi semplicemente ridimensionare mettendo davanti al tuo server di gioco un componente loadbalancer che può inoltrare il giocatore in entrata al server di destra secondo il loro carico

1.3) NIO può gestire da migliaia a milioni di connessioni su una singola scatola. Non preoccuparti di questo.

2.1) Gestisci le tue sessioni giocatore e 2.2) essere lontano dall'architettura EJB. Mangerà tutta la potenza del tuo box invece di assegnare potenza al tuo gioco che è il tuo obiettivo.

2.3) HTTP può servire a tutti i client ma se esegui il gioco in tempo reale incoraggio l'uso del socket binario e mantieni HTTP solo per bilanciamento del carico, login, statistiche e fallback quando non riesci a stabilire una connessione socket.

2.4) Il server basato su socket può gestire centinaia di migliaia di messaggi in entrata al secondo. Questa è la proprietà del sistema a bassa latenza

Mentre è molto interessante immergersi nella costruzione di tale sistema. Qual è il tuo obiettivo? Impara a costruire tale sistema o avere successo nel tuo gioco?

Esistono già molti framework di tecnologia per server di gioco multiplayer Java. SmartFox Server, ElectroTank ...

Abbiamo il nostro java high load Nuggeta multiplayer multipiattaforma java game server che tratta tutti i punti discussi sopra e molto altro ancora. Se vuoi provarlo è gratis.

Se il tuo obiettivo è scrivere un server di gioco è un'impresa eccezionale che può richiedere molto tempo ma molto eccitante. Se il tuo obiettivo è riuscire nella tua partita. Raccogli tra l'SDK Java del server di gioco già esistente.

    
risposta data 19.06.2015 - 16:53
fonte

Leggi altre domande sui tag