En primer lugar, permítanme dar una breve descripción del escenario. Estoy escribiendo un juego simple donde casi todo el trabajo se realiza en el lado del servidor con un cliente ligero para que los jugadores puedan acceder a él. Un jugador inicia sesión o crea una cuenta y luego puede interactuar con el juego moviéndose alrededor de una cuadrícula. Cuando ingresan a una celda, deben ser informados de otros jugadores en esa celda y, de manera similar, se informará a los demás jugadores de esa celda de ese jugador que ingresa. Hay muchas otras interacciones y acciones que pueden tener lugar, pero no vale la pena entrar en detalles sobre ellas, ya que es más de lo mismo. Cuando un jugador cierra la sesión y vuelve a entrar o si el servidor se cae y vuelve a subir, todo el estado del juego debería persistir, aunque si el servidor falla, no importa si pierdo 10 minutos o más de cambios.¿Gestión de sesiones de NHibernate?
He decidido utilizar NHibernate y una base de datos SQLite, así que he estado leyendo mucho en NHibernate, siguiendo tutoriales y escribiendo algunas aplicaciones de muestra, ¡y estoy completamente confundido en cuanto a cómo debo hacerlo!
La pregunta que tengo es: ¿cuál es la mejor manera de administrar mis sesiones? Sólo a partir de la pequeña cantidad que yo entiendo, todas estas posibilidades saltan a mí:
- Tener una sola sesión que siempre abiertos que todos los clientes utilizar
- tener una sola sesión para cada cliente que se conecta y al ras periódicamente
- Abrir una sesión cada vez que tenga que usar cualquiera de las entidades persistentes y cerrarla tan pronto como la actualización, inserción, eliminación o consulta esté completa
- Tener una sesión para cada cliente, pero mantenerla desconectada y solo vuelva a conectarlo cuando necesite usarlo
- Sam e que el anterior, pero mantenerlo conectado y sólo se desconecte después de un cierto período de inactividad
- Mantenga las entidades adosados y sólo les adjunte cada 10 minutos, por ejemplo, para confirmar los cambios
¿Qué tipo de estrategia debería Utilizo para obtener un rendimiento decente dado que podría haber muchas actualizaciones, insertos, eliminaciones y consultas por segundo de posiblemente cientos de clientes a la vez, y todos deben ser coherentes entre sí?
Otra pregunta más pequeña: ¿cómo debo usar las transacciones de manera eficiente? ¿Está bien que cada cambio sea en su propia transacción, o va a funcionar mal cuando tengo cientos de clientes tratando de alterar las celdas de la grilla? ¿Debo tratar de averiguar cómo agrupar las actualizaciones similares y colocarlas en una sola transacción, o eso será demasiado complicado? ¿Necesito transacciones para la mayor parte?
No estoy tratando de optimizarlo; Solo estoy tratando de descubrir cuáles son los diferentes métodos para hacerlo, para qué son generalmente buenos o no, qué tan bien se escalan y funcionan, etc. antes de comprometerse con uno. Se trata de asegurarme de no hacer nada estúpido y elegir una solución razonablemente sensata. No ajuste de rendimiento. Entonces, en cuanto a su respuesta, ¿qué quiere decir con "solicitud" - qué "solicitud"? ¿Te refieres a cada vez que un jugador hace algo? – IRBMe
Sí con la solicitud me refiero a "cada vez que un jugador hace algo" o "cada llamada del cliente al servidor" – Paco
Después de leer las ediciones que agregó más adelante, tengo una pregunta sobre algo que usted dijo.En cuanto a tener una sola sesión por cliente, pensé que NHibernate garantiza que los métodos como ISession.Find nunca devolverán datos obsoletos. En segundo lugar, parecías desalentado al usar Reconexión/Desconexión porque "NHibernate ya tiene una administración de conexión integrada", pero el manual usa eso en un ejemplo de concurrencia llamado "Larga sesión con control automático de versiones". – IRBMe