Estou usando o Node.js e o Redis. Estou tentando encontrar uma maneira confiável de automatch jogadores. Há um servidor correspondente e vários servidores de jogos configurados.
A seguir, é o que eu preciso que aconteça:
- O jogador envia uma solicitação de ingresso com o tipo de jogo (pequeno / médio etc.)
- O servidor correspondente adiciona o jogador ao tipo de jogo atual que está aguardando jogadores
- O servidor do jogo envia ao jogador o ID do jogo
Atualmente eu implementei isso da seguinte maneira:
- O servidor correspondente ouve o jogo: fila: pequeno usando o BRPOP
- Verifica se existe jogo: fila: pequeno: id = id
- Verifica se game: id: comprimento dos usuários é <= 6 (máximo de jogadores)
- Adiciona jogador ao jogo: id: lista de usuários, se for
- Se a duração do jogo for agora 6, ele removerá jogo: fila: pequeno: id
Se o servidor correspondente encontrar game: fila: small: id está ausente, faça o seguinte:
- Jogo INCR: nextGameId
- Define game: fila: small: id para o ID gerado anteriormente
- Adiciona o ID do jogo ao jogo: fila: aguardando
Os servidores de jogos esperam usando o BRPOP para novos jogos. Quando eles obtêm um, eles esperam até o jogo ter no mínimo 2 usuários e iniciam um cronômetro. Se eles não preencherem nesse período, eles começarão com os usuários que eles têm e, posteriormente, removerão game: fila: small: id (forçando assim o casamenteiro a solicitar um novo jogo).
Enquanto meu método está funcionando, não estou convencido de que funcione bem na produção e parece muito complicado. Eu posso ver o potencial para os seguintes problemas:
- O servidor do jogo trava depois de aceitar o ID do jogo na lista de espera, resultando na adição de usuários ao jogo: id: usuários, mas nada acontece com eles (a falha em si não é um problema, mas os usuários que continuam sendo adicionados à fila de jogos são: )
- Se um usuário desconectar e o jogo não iniciar, o servidor do jogo removerá o usuário da lista game: id: users. Enquanto isso, o servidor de matchmaking pode adicionar um usuário à lista e pensar que o jogo está cheio, removendo-o da fila.
Meu pensamento inicial era mudar para uma única fila de usuários esperando por um tipo de jogo. No entanto, isso apresenta outras questões:
- Se o servidor ao qual os usuários se conectam falhar, ele não removerá o usuário da fila, deixando esse usuário para entrar em um jogo quando eles não existirem. Eu poderia usar conjuntos classificados para armazenar o tempo da solicitação e fazer com que a pesquisa do cliente até que o ID do jogo seja retornado, mas isso significa que não tenho idéia de quanto tempo o cliente esperou e, portanto, não sei se o jogo deve ser iniciado. com menos usuários.
- Sem colocar os usuários em um jogo, eles não têm a capacidade de ver o que os usuários entraram, nem a capacidade de conversar com os usuários que estão aguardando (pois isso requer um ID do jogo).
Nenhuma das formas como eu configurei isso parece certa, então eu esperava que alguém pudesse oferecer algumas sugestões melhores. Eu realmente preciso manter os servidores de jogos e os servidores de partidas separados, a fim de expandi-los conforme necessário.