Estoy trabajando en mi proyecto de tesis de bc que debe ser un servidor de Minecraft escrito en Scala y Akka. El servidor debe poder implementarse fácilmente en la nube o en un clúster (no estoy seguro de si uso la terminología adecuada ... debería ejecutarse en múltiples nodos). Sin embargo, soy novato en Akka y me he estado preguntando cómo implementar tal cosa. El problema que estoy tratando de resolver en este momento es cómo compartir el estado entre los actores en diferentes nodos. Mi primera idea fue tener un actor de Camel que leyera tcp stream de clientes de Minecraft y luego lo enviara al equilibrador de carga, que seleccionaría un nodo que procesaría la solicitud y luego enviaría una respuesta al cliente a través de tcp. Digamos que tengo un actor de implementación de AuthenticationService que verifica si las credenciales proporcionadas por el usuario son válidas. Cada nodo tendría tal actor (o quizás más de ellos) y todos los actores deberían tener exactamente la misma base de datos (o estado) de usuarios todo el tiempo. Mi pregunta es, ¿cuál es el mejor enfoque para mantener este estado? He encontrado algunas soluciones que podría pensar, pero no he hecho algo así, por favor señale las fallas:Akka y el estado entre los actores en el clúster
Solución # 1: Mantener el estado en una base de datos. Esto probablemente funcionaría muy bien para este ejemplo de autenticación donde el estado solo está representado por algo así como una lista de nombre de usuario y contraseñas, pero probablemente no funcionaría en los casos en que el estado contiene objetos que no pueden dividirse fácilmente en enteros y cadenas.
Solución # 2: cada vez que se solicite a un determinado actor que cambie su estado, el actor, después de procesar la solicitud, transmitirá información sobre el cambio a todos los demás actores del mismo tipo que cambiarían su estado según la información enviada por el actor original. Esto parece muy ineficiente y bastante torpe.
Solución n. ° 3: Tener un nodo determinado sirve como una especie de nodo de estado, en el que habría actores que representan el estado de todo el servidor. Cualquier otro actor, excepto los actores en dicho nodo, no tendría ningún estado y pediría a los actores en el "nodo estatal" cada vez que necesitarían algunos datos. Esto parece ser ineficiente y un poco imperfecto.
Así que ahí lo tienes. La única solución que realmente me gusta es la primera, pero como he dicho, probablemente solo funcione en un subconjunto de problemas muy limitado (cuando el estado se puede dividir en estructuras redis). Cualquier respuesta de gurús más experimentados sería muy acertada. Saludos, Tomas Herman
Oye, muchas gracias por la respuesta. Esto parece mucho más difícil de lo que pensé que sería:]. En realidad, tendré que pensar en el problema por un tiempo para averiguar si realmente REQUIERE atomicidad en las operaciones. Veré el libro, gracias por la propina. O tal vez podría simplemente usar otros nodos como esclavos para el maestro que contendría toda la información y otros nodos simplemente recibirían un mensaje y harían algo de cálculo sobre los datos recibidos del maestro. Sin embargo, todavía no se siente bien. – Arg
De nada. Solo recuerde que el problema de tener un nodo maestro siempre será que es un punto único de falla. Si le preocupa la tolerancia a fallas, eso puede ser un problema. Quizás también pueda consultar algunas de las implementaciones distribuidas de la tabla hash para ver si pueden ayudarlo (por ejemplo, Apache Cassandra). – axel22
Sí, la tolerancia a fallas no es un gran problema. No en esta etapa, de todos modos. Además, necesito algún tipo de nodo privilegiado de la definición de todos modos. A la que los clientes de Minecraft se conectarían. – Arg