Pregunta

Estamos desarrollando un sistema de servidor en Scala + Akka para un juego que va a servir a los clientes en Android, iPhone, y Second Life. Hay partes de este servidor que necesitan estar altamente disponibles, que se ejecutan en múltiples máquinas. Si una de esas matrices de servidores (de, por ejemplo, un fallo de hardware), el sistema necesita para seguir funcionando. Creo que quieren los clientes a tener una lista de las máquinas van a tratar de conectar con, similar a cómo funciona Cassandra.

Los ejemplos de varios nodos que he visto hasta ahora con Akka me parecen estar centradas en torno a la idea de escalabilidad, en lugar de alta disponibilidad (al menos en lo que respecta al hardware). Los ejemplos de varios nodos parecen tener siempre un único punto de fallo. Por ejemplo, hay equilibradores de carga, pero si tengo que reiniciar una de las máquinas que tienen los equilibradores de carga, mi sistema sufrirán algún tiempo de inactividad.

¿Hay algunos ejemplos que muestran este tipo de hardware de tolerancia a fallos para Akka? O, ¿tiene alguna idea sobre buenas maneras de hacer que esto suceda?

Hasta el momento, la mejor respuesta que he sido capaz de llegar a es el estudio de los documentos de Erlang OTP, medite en ellos, y tratar de encontrar la manera de poner mi sistema junto con los bloques de construcción disponibles en Akka.

Pero si hay recursos, ejemplos o ideas sobre cómo el estado de acciones entre varias máquinas de una forma que si uno de ellos se cae cosas seguir corriendo, yo seguro de los aprecian, porque yo estoy preocupado que podría ser reinventar la rueda. Tal vez hay un contenedor de STM de varios nodos que mantiene automáticamente el estado compartido en sincronización a través de múltiples nodos? O tal vez esto es tan fácil de hacer que la documentación no se molesta que muestran ejemplos de cómo hacerlo, o tal vez no he sido lo suficientemente a fondo en mi investigación y experimentación todavía. será apreciado pensamientos o ideas.

¿Fue útil?

Solución

HA y gestión de la carga es un aspecto muy importante de la escalabilidad y está disponible como parte de la oferta comercial AkkaSource.

Otros consejos

Si está lista varios hosts potenciales de sus clientes ya, entonces estos pueden convertirse efectivamente en los equilibradores de carga.

Usted podría ofrecer un servicio de sugerencias de acogida y recomienda al cliente qué máquina que deben conectarse a (según la carga actual, o lo que sea), entonces el cliente puede atrapar a la que hasta la conexión falla.

Si el servicio de sugerencias de acogida no está ahí, entonces el cliente puede simplemente recoger una serie aleatoria de la misma lista interna, tratando de ellos hasta que se conecte.

Lo ideal sería que en el primer tiempo de puesta en marcha, el cliente se conectará al servicio de sugerencias de acogida y no sólo se canalizan en un huésped apropiado, pero una lista de otros posibles anfitriones también. Esta lista rutinaria puede ser actualizado cada vez que se conecta el cliente.

Si el servicio de sugerencias de acogida se ha reducido en los clientes primer intento (poco probable, pero ...) entonces se puede implementar previamente una lista de hosts en el cliente de instalación para que pueda comenzar inmediatamente con selección aleatoria de los ejércitos desde el principio, si que tiene también.

Asegúrese de que su lista de anfitriones es nombres reales de acogida, y no PI, que le dan mayor flexibilidad a largo plazo (es decir, se le "siempre tiene" host1.example.com, host2.example.com ... etc. . incluso si se muda de infraestructura y de cambio de IPs).

Se puede echar un vistazo de cómo RedDwarf y del tenedor DimDwarf se construyó. Son los dos servidores de aplicaciones de juego de choque de sólo horizontalmente escalables y DimDwarf está escrito en parte en Scala (nueva funcionalidad de mensajería). Su enfoque y la arquitectura debe ajustarse a las necesidades bastante bien :)

2 centavos ..

"cómo el estado de acciones entre varias máquinas de una forma que si uno de ellos se cae cosas seguir corriendo"

No comparta estado entre las máquinas, en lugar del estado de partición a través de máquinas. No sé su dominio, así que no sé si esto va a funcionar. Pero, en esencia si asigna ciertos agregados (en términos DDD) a ciertos nodos, puede mantener esos agregados en la memoria (actor, agente, etc.) cuando se están utilizando. Con el fin de hacer esto usted tendrá que usar algo como empleado del zoológico para coordinar qué nodos mango que los agregados. En el caso de que no se puede llevar el agregado hasta en un nodo distinto.

Más aún, si se utiliza un modelo de evento de abastecimiento para construir sus agregados, se hace casi trivial para tener copias en tiempo real (esclavos) de su agregado en otros nodos de los nodos de escucha de eventos y mantener sus propias copias.

Mediante el uso de Akka, obtenemos comunicación remota entre nodos casi gratis. Esto significa que cada vez que se ocupa de nodo una petición que necesite interactuar con un agregado / entidad en otros nodos puede hacerlo con RemoteActors.

Lo que he descrito aquí es muy general, pero da una aproximación a la distribución de tolerancia a fallos con Akka y ZooKeeper. Puede o no puede ayudar. Espero que así sea.

Todo lo mejor, Andy

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top