2008-10-20 20 views
33

Estoy trabajando en un servicio de notificación simple que se utilizará para entregar mensajes a los usuarios que navegan en un sitio web. Las notificaciones no tienen que enviarse en tiempo real, pero podría ser una mejor experiencia para el usuario si ocurrieran con más frecuencia que cada 5 minutos. Los datos que se envían desde y hacia el cliente no son muy grandes y es una consulta directa de la base de datos para recuperar los datos.Notificación al cliente, ¿debo usar un AJAX Push o Poll?

En la lectura de otras conversaciones sobre el tema, parece que un empuje AJAX puede dar lugar a mayores cargas del servidor. Como puedo tolerar demoras más prolongadas en el servidor, vale la pena tener las notificaciones push del servidor o simplemente sondear.

No es mucho más difícil de poner en práctica el escenario de empuje y así que pensé que vería lo que la opinión ha sido aquí.

Gracias por su ayuda.

EDIT: He investigado un simple AJAX Push e implementado una demostración simple basada en este article de Mike Purvis. La carga del cliente es bastante baja, alrededor de 5k para la versión inicial y se espera que permanezca así durante bastante tiempo.


Gracias a todos por sus respuestas. Decidí ir con la solución de sondeo, pero para envolverla en una biblioteca de utilidades para que, si quieren cambiarla más adelante, sea más fácil.

+0

El enlace no está funcionando –

+1

Parece que el enlace murió hace bastante tiempo. Aquí hay una copia de los archivos de internet: https://web.archive.org/web/20110611075502/http://uwmike.com:80/articles/2008/01/22/browser-data-push/ – smaclell

Respuesta

5

Debido a que el uso de una inserción requiere una conexión HTTP abierta entre su servidor y cada cliente, yo también iría a la encuesta, no solo va a consumir una gran cantidad de recursos del servidor, sino que también va a ser significativamente más difícil de implementar que Matt b mencionado.

Mi experiencia con el sondeo es que si usted tiene un intervalo de sondeo suficientemente frecuentes en un sitio lo suficientemente ocupado registros del servidor web pueden quedar inundado con peticiones de la encuesta verdadera rápidamente.

Edit (2017): Diría que sus elecciones ahora son entre websockets y larga votación (mencionado en otra respuesta). Parece que una encuesta larga puede ser la elección correcta en función de la forma en que la pregunta menciona que las notificaciones no necesitan ser recibidas en tiempo real, un período de votación poco frecuente sería bastante fácil de implementar y no debería ser muy agotador para su servidor . Websockets son geniales y una gran opción para muchas aplicaciones hoy en día, aunque suena como que podría ser exagerado en este caso.

+3

"not solo eso va a consumir ... "qué". ¿La votación o el empuje?No lo dice claramente –

+2

Guau, esta respuesta fue de 2008. Mucho ha cambiado desde entonces. – mmacaulay

+0

@mmacaulay¿Qué tipo de tecnologías sugerirías por ahora, en 2017?)) –

3

Implementaré una encuesta simplemente porque suena más simple de escribir, y mantenerla simple es muy valiosa.

1

No estoy seguro si usted ha tomado un vistazo a algunas de las implementaciones de COMET por ahí (que es lo que quiere decir con AJAX push).

Si el usuario está navegando por el sitio, se no es que, en efecto, de solicitar información al servidor que esta notificación puede piggy-back en?

1

no he probado a mí mismo, pero algunos dicen que COMET works and is easier than you think. También hay un complemento de Ruby on Rails llamado Juggernaut del que he oído hablar mucho. Una vez más, no lo he usado, por lo tanto, YMMV, pero tengo entendido que se requieren muchos menos recursos en comparación con las encuestas. Creo (¿alguien puede confirmar?) Que COMET es cómo MacRumorsLive.com ofrece blogs en vivo de WWDC Stevenotes.

1

Es imposible determinar si la votación será más costosa que presionar sin saber cuántos clientes tendrá.Recomendaría polling porque:

  • Parece que desea actualizar los datos aproximadamente una vez por minuto. A menos que las notificaciones puedan llegar a un ritmo mucho más rápido que eso, presionar significaría mantener abierta una conexión HTTP pero viendo muy poca actividad en ella.
  • El sondeo se basa en las convenciones HTTP existentes, por lo que cualquier servidor que hable con navegadores web ya está listo para responder a las solicitudes Ajax normales. Una solución basada en socket Comet o Flash tiene diferentes requisitos; necesitarás algo como cometd en el lado del servidor y una biblioteca del lado del cliente que grabe el empuje del lado del servidor.

Así que si necesitabas algo pesado para gestionar un torrente de datos y una gran cantidad de clientes, recomendaría Comet. Pero ese no parece ser el caso.

7

Ambos tienen diferentes requisitos y abordan diferentes escenarios.

Si necesita actualizaciones en tiempo real, como en un chat en línea, push es obligatorio.

Pero, si el período de actualización es grande, como lo es en su caso (5 minutos), entonces el grupo es la solución adecuada. Push, en este caso, requerirá una gran cantidad de recursos tanto del cliente como del servidor.

Sugerencia! intente que la página que comprueba el grupo sea rápida y limpia, por lo que no consume muchos recursos en el servidor en cada solicitud. Lo que suelo hacer es mantener una bandera en la memoria (como en una variable de sesión) que dice que si la agrupación está vacía o no ... entonces, solo hago que havy busque en la agrupación solo si no está vacía. Cuando el grupo está vacío, que es la mayor parte del tiempo, la solicitud de página se ejecuta extremadamente rápido.

+0

Mmm interesante. Gracias por la sugerencia, probablemente le daré una oportunidad. – smaclell

10

Definitivamente uso empuje su mucho más fresco. Si solo quieres notificaciones simples, usaría algo como StreamHub Push Server para hacer el trabajo pesado por ti. Desarrollar su propia funcionalidad de Ajax Push es un camino extremadamente complicado y difícil: tiene que hacerlo funcionar en todos los navegadores y luego manejar cortafuegos y servidores proxy matando a las conexiones para mantener vivo, etc. ... Por qué reinventar la rueda. Además, tiene una huella similar de menos de 10 K, por lo que debería ser adecuado si es una prioridad para usted.

+7

+1 por no desarrollarlo usted mismo –

+16

A veces creo que debo ser el único que disfruta creando ruedas –

+10

Una cosa es disfrutarlo. Otra cosa es tener el tiempo y los recursos para dedicarle cuando podría usar el existente :) –

1

Ahora hay un servicio http://pusherapp.com que está tratando de resolver este problema de una vez por todas, en un abrir y cerrar de ojos. Podría valer la pena echarle un vistazo. (descargo de responsabilidad: de ninguna manera estoy asociado con ellos).

12

Estoy sorprendido de que nadie haya mencionado long-polling. El sondeo largo significa mantener una conexión abierta durante un período más prolongado (digamos 30-60 segundos), y una vez que está cerrada, volver a abrirla de nuevo, y simplemente hacer que el conector/conexión escuche las respuestas. Esto da como resultado menos conexiones (pero más largas), y significa que las respuestas son casi inmediatas (algunos tendrán que esperar una nueva conexión de sondeo). Me gustaría añadir que, en combinación con tecnologías como NodeJS, esto resulta en una solución muy eficiente y ligera, que es 100% compatible con el navegador en todos los principales navegadores y versiones, y no requiere ninguna tecnología adicional como Comet o Destello.

Comprendo que esto es una vieja pregunta, pero pensaron que aún podría ser útil proporcionar esta información :)

+0

Si miras el enlace push provisto, esencialmente un sondeo más largo que devuelve los datos a la persona que llama poco a poco, lo que efectivamente es un sondeo largo pero puede enviar datos inmediatamente cuando está listo para imitar un empujón. – smaclell

+0

Ah, no me preocupo, simplemente no lo mencioné en ninguno de los resopnses, lo cual me pareció extraño :) – Oddman

+0

@Oddman ¿Hay alguna diferencia entre Poling descrito en una respuesta aceptada y Long Poling? –

Cuestiones relacionadas