Arquitectura del servidor - Redis vs servidor de socket

Yo desde:

Tengo un servidor de juego que se va a ejecutar en unos pocos casos.

Mundial 1, 2 mundo, mundo 3

Cada mundo es un servidor que se ejecuta en una dirección IP diferente.

Hay una lista de lo que el juego debe tener:

  • La conexión con el juego, la autenticación del usuario.
  • Capacidad de ver todos los jugadores conectados, mostrar qué mundo cada jugador está conectado.
  • Capacidad de mensaje de un jugador, incluso si hes conectados a un servidor mundo diferente.
  • Capacidad de enviar mensaje global a todos los servidores.

Hay dos enfoques para hacer esto que se me ocurre:

Enfoque 1 - Servidor de conexión TCP / IP

  • Crear un servidor intermediario. Cuando un cliente se conecta a un mundo, ese servidor mundo enviará un paquete de solicitud de inicio de sesión para las credenciales de usuario introducidos y el servidor de inicio de sesión comprobará la base de datos y responder con el resultado de la autenticación, si se realiza correctamente, el usuario será autorizado en el mundo.

  • Inicio de sesión del servidor siempre se actualizará todos los mundos con la lista de los jugadores en línea, y el estado de cada jugador, en qué mundo está encendido, etc.

  • Cuando se envía un mensaje al jugador Y del jugador X cuando ambos se encuentran en diferentes mundos, el servidor del mundo enviará un mensaje al servidor de inicio de sesión, y el servidor de inicio de sesión pasará al mundo objetivo de ese jugador para que el jugador en el otro mundo recibirá el mensaje.

IMG] ([! [Enter Descripción imagen aquí

enfoque 2

Trabajar lo mismo que el enfoque 1 pero en lugar de un servidor de inicio de sesión, tener un servidor HTTP API, y actualizar uno al otro con eventos utilizando el servidor Redis. ¿Por qué creo que esto es mejor? Debido a que será más fácil de integrar una aplicación web para el juego, por lo que permitirá a los usuarios conectados y chatear entre sí a través de una aplicación web.

Con el fin de hacer eso en el enfoque 1, es necesario agregar un nuevo túnel para el servidor de inicio de sesión de TCP / IP para conexiones WebSocket de apoyo.

introducir descripción de la imagen aquí

Lo siento por los malos dibujos.

Es posible acercamiento 2? ¿Qué u piensa es un enfoque mejor y si hay algún otro método que se pueda imaginar?

SolverWorld:

There are many considerations that you haven't given us, but I will try to give a general answer. A typical way to do something like this is with a Load Balancer, which distributes the initial connection across the machines (Worlds) at the backend. You didn't say if users are supposed to connect to a specific world, or just any one. There are ways to make the Load Balancer be sticky, but you might want a different approach, if say, if user get to choose their world upon login. In any case it might look like this:

Diagrama de bloques con equilibrador de carga

A continuación, utilizar la base de datos de credenciales de acceso, que cada mundo verificaría para cada inicio de sesión. A continuación, el usuario Redis (se puede utilizar la base de datos, pero Redis es más rápido) para realizar un seguimiento de los usuarios actuales, qué mundo estaban encendidas, etc. También se puede utilizar para enviar mensajes, o podría una cola de mensajes (con una fuente / sumidero de cada mundo). Este método también es muy escalable. Si necesita más mundos, sólo tiene que añadir más de la misma máquina exacta detrás del equilibrador de carga, sin tener que cambiar ningún código.

Como ya he dicho, esto es sólo una respuesta general, y los detalles de su situación puede hacer que otros enfoques más atractivo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=173292&siteId=1
Recomendado
Clasificación