Originally Posted by ArcticWolf
Les explico como funciona un servidor de un juego genérico (no tiene por qué ser Regnum).
Simple:
El server tiene una copia de los datos en memoria y otra en la base de datos. Como la base de datos es lenta como una tortuga entonces guarda temporalmente todo en memoria, hasta que decide que hay suficiente como para tirárselo a la base de datos. Cuando se cae el server, se borra lo que tenía en la memoria y que todavía no estaba en la base de datos. Es por eso que Surak dice que "no es justo".
Extendido:
Los mensajes llegan a través de un hilo dedicado a la comunicación IO, encargada del envío de datos. Eso se pasa por un parser, que lo tira a un dispatcher (generalmente equipotente para evitar duplicaciones), y luego caen en una queue o cola. Esos datos son leídos por los diversos submotores que componen funcionalidades específicas, como posicionamiento, mobs, recursos, mapa... Pero de algún lado tienen que sacar la información.
Sumado a esto existe algo llamado ORM, que mantiene una abstracción de los datos en la DB como objetos (o structs) en memoria. La idea es que ese ORM es el intermediario entre consultas SQL en crudo y algo más elevado y cercano al lenguaje. Además, las bases de datos profesionales contienen algo llamado transacciones, que permiten que la introducción de datos no cree registros huérfanos o inconsistentes).
¿Pero qué tiene que ver, Xephy? Las bases de datos como MySQL, OracleDB, Informix, PostrgreSQL y muchas más mantienen la seguridad de los datos de esta forma. El problema es que una transacción es segura, pero leeenta. Es por eso que muchas veces los ORMs mantienen los cambios en memoria hasta que cambien lo suficiente y se guarda todo a disco. Eso se llama dirty-triggered flush.
Cuando el servidor colapsa (stack overflow, auto-shutdown, if(ptr){scream(reallyLoud)}), lo más probable es que la capa ORM se muera con parte de los datos sin escribir, o mientras escribía. La base de datos deshace la transacción y se "pierde" información (que en realidad nunca estuvo almacenada, nada más).
|