Hola a todos.
Desde el lanzamiento de Diablo II: Resurrected, hemos experimentado múltiples problemas en los servidores, y queríamos ofrecer algo de transparencia sobre lo que está causando estos problemas y las medidas que hemos tomado hasta ahora para solucionarlos. También queremos daros una idea de cómo progresaremos a partir de ahora.
Resumen: Las interrupciones de nuestros servidores no han sido causadas por un único problema; estamos solucionando cada problema a medida que se presenta, tanto con soluciones de mitigación como con cambios a la arquitectura a largo plazo. Un pequeño número de jugadores ha experimentado la pérdida de la progresión de los personajes; a partir de ahora, cualquier pérdida debida a una caída del servidor debería limitarse a varios minutos. No consideramos esto una solución definitiva, y seguimos trabajando en ello. Nuestro equipo, con la ayuda de otros en Blizzard, está trabajando para llevar la experiencia de juego a un lugar que se sienta bien para todos.
Vamos a entrar un poco en profundidad con algunos detalles de ingeniería, pero esperamos que, en general, esto os ayude a entender por qué se han producido estos cortes y qué hemos estado haciendo para solucionar cada caso, además de cómo estamos investigando la causa general. Empecemos por el principio.
El problema de los servidores:
Antes de hablar de los problemas, daremos brevemente un contexto de cómo funcionan las bases de datos de nuestros servidores. En primer lugar, está nuestra base de datos global, que existe como la única fuente de verdad para toda la información y el progreso de tu personaje. Como puedes imaginar, eso es una gran tarea para una sola base de datos, y no sería suficiente por sí sola. Por eso, para aliviar la carga y la latencia de nuestra base de datos global, cada región -NA, UE y Asia- tiene bases de datos individuales que también almacenan la información y el progreso de tu personaje, y la base de datos de tu región escribe periódicamente en la global. La mayoría de tus acciones en el juego se realizan en esta base de datos regional porque es más rápida, y tu personaje está "bloqueado" allí para mantener la integridad de los registros de los personajes individuales. La base de datos global también tiene una copia de seguridad en caso de que la principal falle.
Teniendo esto en cuenta, para explicar lo que ha estado ocurriendo, nos centraremos en los tiempos de inactividad experimentados entre el sábado 9 de octubre y ahora.
El sábado por la mañana, hora del Pacífico, sufrimos una interrupción global debido a un repentino y significativo aumento del tráfico. Este fue un nuevo umbral que nuestros servidores no habían experimentado en absoluto, ni siquiera en el lanzamiento. Esto se vio agravado por una actualización que habíamos lanzado el día anterior con la intención de mejorar el rendimiento en torno a la creación de juegos; estos dos factores combinados sobrecargaron nuestra base de datos global, haciendo que se agotara. Decidimos anular la actualización del viernes que habíamos desplegado previamente, con la esperanza de que eso aliviara la carga de los servidores de cara al domingo, al tiempo que nos daba el tiempo necesario para investigar más a fondo la causa principal.
El domingo, sin embargo, quedó claro que lo que habíamos hecho el sábado no era suficiente: vimos un aumento aún mayor del tráfico, lo que nos llevó a otra interrupción. Nuestros servidores de juegos observaban la desconexión de la base de datos e inmediatamente intentaban volver a conectarse, repetidamente, lo que significaba que la base de datos nunca tenía tiempo para ponerse al día con el trabajo que habíamos completado porque estaba demasiado ocupada gestionando un flujo continuo de intentos de conexión por parte de los servidores de juegos. Durante este tiempo, también vimos que podíamos hacer mejoras de configuración en el registro de eventos de nuestra base de datos, que es necesario para restaurar un estado saludable en caso de fallo de la base de datos, así que las completamos, y emprendimos un nuevo análisis de la causa raíz.
El arma de doble filo de la interrupción del domingo fue que, debido a lo que habíamos enfrentado el sábado, habíamos creado lo que era esencialmente un libro de técnicas sobre cómo recuperarse de ella rápidamente. Lo cual era bueno.
Pero como volvimos a estar en línea tan rápidamente en un momento de máxima actividad de los jugadores, con cientos de miles de partidas en decenas de minutos, volvimos a caer. Lo cual fue malo.
Así que tuvimos que hacer muchas correcciones, incluyendo mejoras en la configuración y el código, que desplegamos en la base de datos global de respaldo. Esto nos lleva al lunes 11 de octubre, cuando hicimos el cambio entre las bases de datos globales. Esto condujo a otra interrupción, cuando nuestra base de datos de reserva continuó erróneamente su proceso de copia de seguridad, lo que significa que pasó la mayor parte de su tiempo tratando de copiar de la otra base de datos cuando debería haber estado atendiendo las solicitudes de los servidores. Durante este tiempo, descubrimos otros problemas e hicimos más mejoras: encontramos una consulta, ya obsoleta, pero que nos obligaba a eliminarla por completo de la base de datos, optimizamos las comprobaciones de elegibilidad de los jugadores cuando se unen a una partida, lo que alivió aún más la carga, y estamos probando más mejoras de rendimiento en estos momentos. También creemos que hemos solucionado las tormentas de reconexión de la base de datos que estábamos viendo, porque no las vimos el martes.
El martes, alcanzamos otro máximo de jugadores concurrentes, con algunos cientos de miles de jugadores en una sola región. Esto hizo que nos encontráramos con otro incidente de rendimiento degradado de la base de datos, en cuya causa están trabajando actualmente nuestros ingenieros de la base de datos. También hemos recurrido a otros ingenieros de Blizzard para que trabajen en pequeñas correcciones mientras nuestro equipo se centraba en los problemas del servidor central, y también hemos pedido ayuda a nuestros socios externos.
Por qué ocurre esto
Para mantenernos fieles al juego original, hemos conservado mucho código original. Sin embargo, un servicio original en particular está sufriendo con el comportamiento de los jugadores modernos.
Este servicio, con algunas actualizaciones del original, se encarga de piezas críticas de la funcionalidad del juego, a saber: la creación/unión de partidas, la actualización/lectura/filtrado de listas de partidas, la verificación del estado del servidor del juego y la lectura de personajes de la base de datos para garantizar que tu personaje pueda participar en lo que sea que estés filtrando. Es importante destacar que este servicio es un singleton, lo que significa que sólo podemos ejecutar una instancia del mismo para garantizar que todos los jugadores vean la lista de juegos más actualizada y correcta en todo momento. Hemos optimizado este servicio de muchas maneras para ajustarlo a la tecnología más moderna, pero como hemos mencionado anteriormente, muchos de nuestros problemas provienen de la creación de juegos.
Mencionamos el "comportamiento moderno de los jugadores" porque es un punto interesante en el que pensar. En 2001, no había tanto contenido en Internet sobre cómo jugar a Diablo II "correctamente" (runs de Baal para obtener XP, Pindleskin/Túneles antiguos/etc para hacer hallazgo mágico, etc.). Sin embargo, hoy en día, un jugador nuevo puede buscar cualquier número de increíbles creadores de contenido que pueden enseñarle a jugar de diferentes maneras, muchas de las cuales incluyen mucha carga de la base de datos en forma de creación, carga y destrucción de partidas en rápida sucesión. Aunque preveíamos esto -con los jugadores haciendo personajes nuevos en servidores nuevos, trabajando duro para conseguir sus objetos de hallazgo mágico- subestimamos enormemente el alcance que obtuvimos de las pruebas beta.
Además, en general, guardábamos con demasiada frecuencia en la base de datos global: No es necesario hacerlo tan a menudo como lo hacíamos. Deberíamos guardarlo en la base de datos regional, y sólo guardarlo en la base de datos global cuando necesitemos desbloquearlo; ésta es una de las medidas de mitigación que hemos puesto en marcha. Ahora mismo estamos escribiendo código para cambiar por completo la forma de hacer esto, de modo que casi nunca guardemos en la base de datos global, lo que reducirá significativamente la carga en ese servidor, pero se trata de un rediseño de la arquitectura que llevará algún tiempo construir, probar y luego implementar.
Una nota sobre la pérdida de progreso:
La pérdida de progreso que han experimentado algunos jugadores se debe a la forma en que realizamos los bloqueos de personajes tanto en la base de datos regional como en la global: bloqueamos a tu personaje en la base de datos global cuando se te asigna a una región (por ejemplo, cuando juegas en la región de América, tu personaje se bloquea en la región de América, y la mayoría de las acciones se resuelven en la base de datos de la región de América).
El problema fue que durante una interrupción del servidor, cuando la base de datos se caía, varios personajes se quedaban atascados en la base de datos regional, y no teníamos forma de trasladarlos a la base de datos global. En ese momento, creíamos que teníamos dos opciones: o bien desbloqueábamos a todos los que tuvieran cambios sin guardar en la base de datos global, con lo que se perdería parte del progreso debido a una sobreescritura que se produciría en la base de datos global, o bien hacíamos caer el juego por completo durante un tiempo indeterminado y ejecutábamos un script para escribir los datos regionales en la base de datos global.
En ese momento, optamos por la primera opción: pensamos que era más importante mantener el juego en funcionamiento para que la gente pudiera jugar, en lugar de interrumpir el juego durante un largo periodo de tiempo para restaurar los datos. Lamentamos profundamente que los jugadores hayan perdido progresos importantes u objetos valiosos. Como jugadores que somos, conocemos el dolor de un rollback y lo sentimos profundamente.
En el futuro, creemos que tenemos una forma de restaurar los personajes que no conlleva una pérdida de datos significativa: debería limitarse a varios minutos de pérdida, si es que hay alguna, en caso de caída del servidor.
Esto es mejor, pero todavía no es suficiente a nuestros ojos.
Lo que estamos haciendo al respecto:
Limitar la velocidad: Estamos limitando el número de operaciones a la base de datos en torno a la creación y unión de partidas, y sabemos que esto lo estáis sintiendo muchos de vosotros. Por ejemplo, para los que hacéis carreras de Pindleskin, entraréis y saldréis de una partida y crearéis una nueva en 20 segundos. En este caso, se limitará la velocidad en un punto. Cuando esto ocurra, el mensaje de error dirá que hay un problema de comunicación con los servidores del juego: esto no es un indicador de que los servidores del juego estén caídos en esta instancia en particular, sólo significa que se ha limitado la tasa para reducir la carga temporalmente en la base de datos, en el interés de mantener el juego funcionando. Podemos asegurarte que esto es sólo una mitigación por ahora, no vemos esto como una solución a largo plazo.
Creación de colas de acceso: Este fin de semana pasado hubo una serie de problemas, no el mismo problema una y otra vez. Debido a la revitalización de la base de jugadores, la adición de múltiples plataformas y otros problemas relacionados con el escalamiento, es posible que sigamos teniendo pequeños problemas. Para diagnosticarlos y resolverlos rápidamente, tenemos que asegurarnos de que este efecto manada: cuando un gran número de jugadores entran simultáneamente, se detenga. Para solucionarlo, tenemos gente trabajando en una cola de inicio de sesión, muy parecida a la que puedes experimentar en World of Warcraft. Esto mantendrá la población en el nivel de seguridad que tenemos en ese momento, de modo que podamos controlar dónde se está produciendo la sobrecarga del sistema y solucionarlo antes de que se caiga el juego por completo. Cada vez que arreglemos una sobrecarga, podremos aumentar los topes de población. Esta cola de inicio de sesión ya se ha implementado parcialmente en el backend (ahora mismo, parece una autenticación fallida en el cliente) y debería estar totalmente en marcha en los próximos días en PC, y después en consola.
Descomponer las piezas críticas de la funcionalidad en servicios más pequeños: Este trabajo está parcialmente en marcha para las cosas que podemos abordar en menos de un día (algunas ya se han completado esta semana) y también está previsto para proyectos más grandes, como los nuevos microservicios (por ejemplo, un servicio GameList que sólo se encarga de proporcionar la lista de juegos a los jugadores). Una vez que la funcionalidad crítica se haya desglosado, podremos estudiar la ampliación de nuestros servicios de gestión de juegos, lo que reducirá la cantidad de carga.
Tenemos gente trabajando increíblemente duro para gestionar las incidencias en tiempo real, diagnosticando los problemas e implementando las correcciones, no sólo en el equipo de D2R, sino en todo Blizzard. Este juego significa mucho para todos nosotros. Muchos de los miembros del equipo somos jugadores de D2 de toda la vida: jugamos durante su lanzamiento inicial en 2001, algunos forman parte de la comunidad de modders, etc. Podemos asegurar que seguiremos trabajando hasta que la experiencia de juego nos parezca buena, no sólo como desarrolladores, sino también como jugadores y miembros de la comunidad.
Por favor, seguid enviando vuestros comentarios al foro de Diablo II: Resurrected, informad de vuestros errores en nuestro foro de Informe de errores y, si necesitáis ayuda para solucionar problemas, visitad nuestro foro de Soporte técnico. Gracias por vuestra continua comunicación con nosotros a través de todos los canales: es muy valiosa para nosotros mientras trabajamos en estos problemas.
El equipo de la comunidad de Diablo os mantendrá informados de nuestros progresos a través de los foros.
El equipo de desarrollo de Diablo II: Resurrected.