Pregunta

He desarrollado una aplicación web de chat que utiliza una base de datos SqlServer para el intercambio de mensajes.

Todos los clientes sondean cada x segundos para comprobar si hay nuevos mensajes.

Es obvio que este enfoque consume muchos recursos, y me preguntaba si hay una manera "más barato" de hacerlo.

Yo uso el mismo enfoque de "presencia": comprobar que se encuentra en

.
¿Fue útil?

Solución

Para algo así como una aplicación de chat en tiempo real, lo recomiendo una memoria caché distribuida con un respaldo de SQL. Resulta que como memcached con el proveedor Enyim .NET, por lo que me gustaría hacer algo como lo siguiente:

  1. mensaje de los mensajes de usuario
  2. Sistema escribe el mensaje a la base de datos
  3. Sistema escribe un mensaje a un caché
  4. Todos los usuarios caché encuesta periódicamente si hay nuevos mensajes

El respaldo de la base de datos le permite precargar la memoria caché en el caso de que se borre la caché o se reinicia la aplicación, pero los bits funcionales se basan en caché en memoria, en vez de interrogar la base de datos.

Otros consejos

Sin necesidad de utilizar un navegador plug-in / extensión como Flash o applet de Java, el navegador es esencialmente una herramienta de comunicación de una manera. La solicitud tiene que ser iniciado por el navegador para obtener los datos. No se puede datos de 'empuje' al navegador.

Muchos aplicación web utilizando el método de votación Ajax para simular un servidor de 'empuje'. El truco está en equilibrar el tamaño de frecuencia / de datos con los recursos de ancho de banda y de servidor.

Acabo de hacer una simple observación de Gmail. Se hace un sondeo HttpPost cada 5 segundos. Si no hay cambio 'Estado', el tamaño de datos de respuesta es de sólo unos pocos bytes (sin incluir las cabeceras HTTP). Por supuesto google tiene enormes recursos del servidor y el ancho de banda, es por eso que menciono: encontrar un buen equilibrio.

Esto es "Mejorar la experiencia del usuario frente a los recursos del servidor". Puede que tenga que salir con una forma creativa de la estrategia de votación, en lugar de un sondeo directo cada x segundos.

por ejemplo. Si no hay actividad de la Parte A, sondear cada 3 segundos. Mientras que la parte A está escribiendo, sondear cada 5 segundos. Esto es sólo una Illustraton, se puede jugar con los números, o sale con uno más eficiente.

Por último, el intercambio de datos. El reto es encontrar una manera de pasar los tamaños mínimos de datos para transmitir la misma información.

mis 2 centavos:)

Si está utilizando SQL Server 2005 se puede ver en Notification Services. Concedió esto le encerraría en SQL 2005 como servicios de notificación se retiró en SQL 2008 que fue diseñado para permitir que el servidor SQL Server para notificar a las aplicaciones cliente de cambios a la base de datos.

Si quieres algo un poco más escalable, se puede poner un par de indicadores de bits en el registro de usuarios. Cuando un mensaje para el usuario entra en el cambio del bit para los nuevos mensajes a la verdadera. Cuando uno lee los mensajes cambian a 0. Lo mismo para cuando la gente se registra y se apaga. De esa manera se está leyendo un campo muy pequeño que tiene una muy buena oportunidad de estar ya en la memoria caché.

Hacer el flujo de trabajo estaría listo el bit. Si es 1, entonces ir a buscar los mensajes de la tabla de mensajes. Si es 0 no hacer nada.

En ASP.NET 4.0 se puede utilizar el patrón de observador con objetos y matrices de JavaScript es decir:. AJAX JSON llama con jQuery y o PageMethods

Se va a tener siempre a golpear la base de datos para hacer un análisis de si hay algún dato para volver o no. El truco estará en hacer esas llamadas de datos pequeño y sólo el retorno cuando sea necesario.

Hay dos soluciones relacionadas incorporadas a SQL Server 2005 y todavía está disponible en SQL Server 2008:

1) Service Broker , que permite a los suscriptores enviar mensajes lee en las colas (el comando con ESPERA RECIBIR ..). En su caso, usted quiere enviar su mensaje a través de la base de datos mediante el uso de Service Broker Servicios al frente de estas colas, que luego pueden ser recogidos por los clientes en espera. No hay votación, los clientes que esperan solo se activan cuando se recibe un mensaje.

2) notificaciones de consulta , que permiten a un abonado para definir una consulta, y las notificaciones recibir cuando el conjunto de datos que resultaría de la ejecución de esa consulta cambiaría. Construida sobre Service Broker, notificaciones de consulta son algo más fáciles de usar, pero también puede ser algo menos eficiente. (No es que las notificaciones de consulta y sus hermanos, notificaciones de eventos son frecuentemente confundidos con Notification Services (NS), que causa preocupación debido NS se liberará en 2008, sin embargo, de consultas y notificaciones de sucesos son aún plenamente disponibles e incluso mejorada en SQL Server 2008).

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