Domanda

Diciamo che ho due applicazioni che devono lavorare insieme in una certa misura.

  1. Un'applicazione web (PHP, Ruby on Rails, ...)
  2. Un'applicazione desktop (Java, C ++, ...)

L'applicazione desktop deve essere notificata dall'applicazione Web e il ritardo tra l'invio e la ricezione della notifica deve essere breve. (< 10 secondi)

Quali sono i modi possibili per farlo? Posso pensare al polling in un intervallo di 10 secondi, ma ciò produrrebbe molto traffico se molte applicazioni desktop dovessero essere notificate. Su una LAN utilizzerei una trasmissione UDP, ma sfortunatamente non è possibile qui ...

Apprezzo tutte le idee che potresti darmi.

È stato utile?

Soluzione

Penso che " best practice " qui dipenderà dal numero di client desktop che ti aspetti di servire. Se c'è un solo desktop da notificare, allora il polling potrebbe essere un buon approccio - sì, il polling è molto più sovraccarico di una notifica basata su eventi, ma sarà sicuramente la soluzione più semplice da implementare.

Se l'overhead del polling è davvero inaccettabile, allora vedo due alternative di base:

  1. Mantieni aperta una connessione persistente tra desktop e web-server (potrebbe essere una richiesta web in stile " comet " o una connessione socket grezza)
  2. Esporre un servizio dall'app desktop e registrare l'indirizzo del servizio con il web server. In questo modo, il server Web può chiamare il desktop secondo necessità.

Attenzione, entrambe le alternative sono piene zeppe di gotcha. Alcuni punti salienti:

  • Mantenere aperta una connessione può essere complicato, poiché si desidera che i server Web siano hot-swap
  • La chiamata a un servizio esterno (ad es. il desktop) da un server Web è pericolosa, poiché questa richiesta potrebbe bloccarsi. Vorresti spostare questa notifica in un thread separato per evitare di legare il server web.

Per mitigare alcune delle preoccupazioni, è possibile disaccoppiare il desktop inaffidabile dal server Web introducendo un server di notifica intermedio: il server Web potrebbe pubblicare un aggiornamento da qualche parte e il desktop potrebbe eseguire il polling / connettersi / registrarsi lì essere avvisato. Per evitare di reinventare la ruota qui, ciò potrebbe comportare una sorta di sistema MessageQueue ... Questo, ovviamente, aggiunge la complessità della necessità di mantenere il nuovo intermediario.

Ancora una volta, tutti questi approcci sono probabilmente abbastanza complessi, quindi direi che il sondaggio è probabilmente la soluzione migliore.

Altri suggerimenti

Riesco a vedere due modi:

  • L'applicazione desktop esegue il polling dell'app Web
  • L'app Web notifica all'applicazione desktop

La tua app web potrebbe pubblicare un feed RSS, ma l'app desktop dovrà comunque eseguire il polling del feed ogni 10 s.

Il traffico non deve essere enorme: se si utilizza un HTTP HEAD , otterrai un piccolo pacchetto con la data dell'ultima modifica (convenientemente chiamato Ultima modifica ).

Non so esattamente cosa fare per realizzare il tuo compito, ma posso suggerire di creare un servizio Windows sul PC dell'applicazione desktop.

Questo servizio controlla l'applicazione web ogni intervallo di tempo alla ricerca di nuove modifiche e, se si sono verificate modifiche, può eseguire l'applicazione desktop con la notifica che c'è una modifica nell'applicazione Web e nell'applicazione Web quando si verificano cambiamenti con cui è possibile rispondere riconoscimento

Spero che questo possa essere utile Non l'ho provato esattamente ma sto suggerendo di usare come questa idea.

Un livello di sindacazione aiuterebbe a ridimensionare il sistema.

L'app desktop può registrarsi con un " editore " servizio (in esecuzione su una o più macchine) Questo servizio editore riceve il " notice " dalla tua app web che qualcosa è cambiato e inizia immediatamente a notificare tutti i suoi abbonati registrati.

Il numero di editori necessari aumenterà con il numero di utenti.

Modifica: ho dimenticato di menzionare che l'app desktop dovrà ascoltare su un socket.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top