Sto usando Node.js e Redis. Sto cercando di trovare un modo affidabile per automatizzare i giocatori. C'è un server corrispondente e quindi più server di gioco impostati.
Di seguito è ciò che devo avere successo:
- Il giocatore invia la richiesta di partecipazione con il tipo di gioco (piccolo / medio ecc.)
- Il server corrispondente aggiunge il giocatore al tipo di gioco corrente in attesa di giocatori
- Il server di gioco invia al giocatore l'ID del gioco
Attualmente ho implementato questo come segue:
- Il server corrispondente ascolta il gioco: coda: piccola usando BRPOP
- Verifica se esiste il gioco: coda: piccolo: id = id
- Verifica se il gioco: id: la lunghezza degli utenti è <= 6 (numero massimo di giocatori)
- Aggiunge il giocatore al gioco: id: elenco utenti se lo è
- Se la lunghezza del gioco ora è 6, rimuove il gioco: coda: piccola: id
Se il server corrispondente trova game: queue: small: id mancante, fa come segue:
- Gioco INCR: nextGameId
- Imposta il gioco: coda: piccola: id per l'ID precedentemente generato
- Aggiunge l'ID del gioco al gioco: coda: in attesa
I server di gioco attendono l'utilizzo di BRPOP per i nuovi giochi. Quando ne ottengono uno, attendono che il gioco abbia un minimo di 2 utenti, quindi avviano un timer. Se non si riempiono in quel momento, iniziano con gli utenti che hanno e successivamente rimuovono il gioco: coda: piccolo: id (costringendo così il matchmaker a richiedere un nuovo gioco).
Mentre il mio metodo funziona, non sono convinto che funzionerà bene in produzione e sembra molto contorto. Vedo il potenziale per i seguenti problemi:
- Il server di gioco si arresta in modo anomalo dopo aver accettato l'ID del gioco dalla lista di attesa e gli utenti vengono aggiunti al gioco: id: utenti ma non accade nulla con loro (l'incidente stesso non è un problema, ma gli utenti che continuano ad essere aggiunti a quella coda di giochi sono )
- Se un utente si disconnette e il gioco non è stato avviato, il server di gioco rimuoverà l'utente dal gioco: id: elenco utenti. Mentre è in procinto di farlo, il server di matchmaking potrebbe aggiungere un utente all'elenco e pensare che il gioco sia pieno, rimuovendolo così dalla coda.
Il mio pensiero iniziale era di passare a una singola coda di utenti in attesa di un tipo di gioco. Tuttavia, ciò presenta ulteriori problemi:
- Se il server a cui gli utenti si connettono si arresta in modo anomalo, non rimuoverà l'utente dalla coda, lasciando così l'utente a entrare in un gioco quando non esiste. Potrei usare set ordinati per memorizzare il tempo della richiesta e fare in modo che il sondaggio del client venga restituito fino a quando non viene restituito un ID gioco, ma ciò significherebbe che non ho idea di quanto tempo quel client ha atteso e quindi non so se avviare il gioco con meno utenti.
- Senza mettere gli utenti in un gioco, non hanno la possibilità di vedere a cosa si sono uniti gli utenti, né la possibilità di chattare con gli utenti in attesa (poiché ciò richiede un ID di gioco).
Nessuno dei modi in cui l'ho impostato sembra giusto, quindi speravo che qualcuno potesse essere in grado di offrire alcuni suggerimenti migliori. Ho davvero bisogno di mantenere separati i server di gioco e i server di matchmaking al fine di farli crescere come richiesto.