Pregunta

Digamos que tengo dos aplicaciones que tienen que trabajar juntas hasta cierto punto.

  1. Una aplicación web (PHP, Ruby on Rails, ...)
  2. Una aplicación de escritorio (Java, C ++, ...)

La aplicación de escritorio debe ser notificada desde la aplicación web y el retraso entre el envío y la recepción de la notificación debe ser breve. (< 10 segundos)

¿Cuáles son las formas posibles de hacer esto? Puedo pensar en sondear en un intervalo de 10 segundos, pero eso produciría mucho tráfico si muchas aplicaciones de escritorio tienen que ser notificadas. En una LAN, usaría una transmisión UDP, pero desafortunadamente eso no es posible aquí ...

Agradezco cualquier idea que me puedan dar.

¿Fue útil?

Solución

Creo que la " mejor práctica " aquí dependerá de la cantidad de clientes de escritorio que espera servir. Si solo se debe notificar a un escritorio, entonces el sondeo puede ser un buen enfoque: sí, el sondeo es mucho más caro que una notificación basada en eventos, pero sin duda será la solución más fácil de implementar.

Si la sobrecarga de las encuestas es realmente inaceptable, entonces veo dos alternativas básicas:

  1. Mantenga una conexión persistente abierta entre el escritorio y el servidor web (podría ser una solicitud web " comet " -style, o una conexión de socket sin procesar)
  2. Exponga un servicio desde la aplicación de escritorio y registre la dirección del servicio en el servidor web. De esta manera, el servidor web puede llamar al escritorio según sea necesario.

Sin embargo, ten cuidado: ambas alternativas están repletas de trampas. Algunos puntos destacados:

  • Mantener una conexión abierta puede ser complicado, ya que desea que sus servidores web sean intercambiables en caliente
  • Llamar a un servicio externo (p. ej., su escritorio) desde un servidor web es peligroso, porque esta solicitud podría colgarse. Desearía mover esta notificación a un hilo separado para evitar atar el servidor web.

Para mitigar algunas de las preocupaciones, puede desacoplar el escritorio poco confiable del servidor web mediante la introducción de un servidor de notificación intermedio: el servidor web podría publicar una actualización en algún lugar, y el escritorio podría sondear / conectarse / registrarse allí ser notificado. Para evitar reinventar la rueda aquí, esto podría involucrar algún tipo de sistema MessageQueue ... Esto, por supuesto, agrega la complejidad de la necesidad de mantener el nuevo intermediario.

Nuevamente, todos estos enfoques son probablemente bastante complejos, por lo que diría que la votación es probablemente la mejor opción.

Otros consejos

Puedo ver dos formas:

  • Su aplicación de escritorio sondea la aplicación web
  • Su aplicación web notifica a la aplicación de escritorio

Su aplicación web podría publicar un feed RSS, pero su aplicación de escritorio aún tendrá que sondear el feed cada 10 s.

El tráfico no necesita ser enorme: si usa un HTTP HEAD , obtendrá un pequeño paquete con la fecha de la última modificación (convenientemente llamado Última modificación ).

No sé exactamente qué hacer para lograr su tarea, pero puedo sugerirle que cree un servicio de Windows en la PC de la aplicación de escritorio.

Este servicio comprueba la aplicación web cada intervalo de tiempo para detectar nuevos cambios y, si se producen cambios, puede ejecutar la aplicación de escritorio con la notificación de que hay un cambio en la aplicación web y en la aplicación web cuando se produce cualquier cambio con el que pueda responder. reconocimiento

Espero que esto pueda ser útil. No lo probé exactamente, pero sugiero usar esta idea.

Una capa de sindicación ayudaría a escalar el sistema.

La aplicación de escritorio puede registrarse con un " publisher " servicio (que se ejecuta en una o varias máquinas) Este servicio de editor recibe el " Notice " desde su aplicación web que algo ha cambiado, e inmediatamente comienza a notificar a todos sus suscriptores registrados.

La cantidad de editores que necesita aumentará con la cantidad de usuarios.

Editar: Olvidé mencionar que la aplicación de escritorio necesitará escuchar en un socket.

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