Hy,SignalR - Manejo de los usuarios desconectados
estoy usando la biblioteca signalR en un proyecto para manejar una notificación y módulos de chat. Tengo una tabla en una base de datos para mantener un registro de los usuarios en línea.
El HUB para chat hereda IDisconnect donde desconecto al usuario. Después de desconectar al usuario, caliento a los usuarios sobre ese evento. En este punto, verifico si el usuario desconectado es el cliente. Si es así, entonces invoco un método en HUB para reconectar al usuario (simplemente actualice la tabla).
Lo hago porque con la implementación actual, una vez que el usuario cierra una pestaña en el navegador llama a la tarea Desconectar pero podría tener otra pestaña abierta.
Aún no he probado (con solicitudes más grandes) este módulo, pero en mi servidor de desarrollo podría tomar unos segundos entre el evento IDisconnect y la solicitud del usuario para conectarse de nuevo.
Me preocupa mi implementación para manejar a los usuarios desconectados del chat, pero no veo otra manera de mejorar esto.
Si es posible, ¿podría alguien darme un consejo sobre esto, o esta es la única solución que tengo?
Actualización: Terminé usando una clase singleton para almacenar todos los usuarios y sus conexiones id del señalizador. De esta forma puedo obtener la identificación del usuario durante la tarea de desconexión (en este punto no tienes ningún httpcontext para obtener la información del usuario, pero siempre puedes obtener la identificación del usuario con la identificación de conexión del señalizador de la matriz en el singleton clase).
20-02-2013 Aunque la solución anterior estaba haciendo el trabajo, tuve la necesidad de escalar mi proyecto. Mi solución fue usar Redis para almacenar todas las conexiones de usuario y aprovechar el tiempo de caducidad de las claves en los eventos de desconexión. Durante la reconexión, verifico si la llave está en estado pendiente (va a caducar en unos minutos).
Un año después he encontrado FB Tornado construido con Python y siguiendo el patrón de no bloqueo he dicho adiós SignalR;) –