Come gestire lo spegnimento / avvio di un'applicazione Java che si basa su eventi in tempo reale?

2

Ho questo progetto Java chiamato Server . Server è essenzialmente un'applicazione a thread singolo che ascolta gli eventi da applicazioni esterne. Questi eventi sono cruciali e quello che manca è un grosso problema.

Quello che Server fa è che ascolta gli eventi, fa alcuni calcoli basati sugli eventi ricevuti e memorizza il valore calcolato nel database. Inoltre, alcuni eventi dipendono l'uno dall'altro e ho una singola mappa statica che tiene traccia di tutti gli eventi in arrivo.

Sto gestendo gli eventi di chiamata. Ci sono tre eventi che sto gestendo attualmente:

  1. Partecipa agli eventi: due persone in una conversazione

  2. Eventi di conversazione: dove una persona A o B sta parlando

  3. Lascia eventi: dove una persona lascia la conversazione

Il mio obiettivo è calcolare quanto tempo ogni persona ha parlato per la durata della conversazione.

Quello che faccio adesso è che quando ottengo un evento Join, aggiungo quella conversazione alla mappa. Mentre parlo di eventi, ottengo la conversazione dalla mia mappa e faccio qualche calcolo. Quando qualcuno abbandona la conversazione, rimuovo la conversazione dalla mappa e salvo ciò che ho nel database.

Dato che non posso permettermi di perdere un singolo evento, come posso implementare la ridondanza? Ho pensato al clustering, ma se mai dovessi fare il cluster, allora entrambi i cluster avranno gli stessi eventi in arrivo, portando alla duplicazione dei dati.

    
posta mpmp 26.02.2016 - 20:14
fonte

1 risposta

1

La frase "cruciale e mancante è un affare enorme" ha davvero un design diverso. In questo momento, una singola istanza dell'app server sta portando a termine il lavoro e qualcuno sta giustamente pensando alla ridondanza nel caso in cui l'app del server non funzioni o non sia in grado di terminare la pubblicazione dell'ultimo evento abbastanza rapidamente.

Risolvere questi problemi richiederebbe ricreare un sacco di ruote che sono state utilizzate per anni per gestire specificamente il sollevamento pesante. Un sistema di accodamento dei messaggi (MQ) si adatterebbe bene. Inseriresti i broker tra i tuoi client e server, gestendo le connessioni con gli eventi e accodando tutti gli eventi e il marshalling al server sul server senza mancarne alcuno. Se il carico aumenta dove due broker non sono in grado di gestire tutti gli eventi, è sufficiente aggiungere altri broker e ridimensionarli. Può sembrare eccessivamente complesso, ma in realtà non lo è e non riesco a pensare a un modo migliore per garantire che gli eventi non vengano persi. Questo è ciò per cui sono state progettate queste tecnologie. Queste soluzioni includono la possibilità di monitorare i broker / code, che è importante se gli eventi mancanti sono un grosso problema.

Un'altra opzione sarebbe quella di eseguire il processo del server su due caselle e un bilanciamento del carico di base che fronteggia le connessioni, ma non sarebbe solido come una soluzione di broker MQ.

Poiché il titolo di questa domanda ha a che fare con l'avvio / arresto di un'app di java server, mi aspettavo che la domanda fosse su come aumentare l'affidabilità di un'app java avvolgendo qualcosa attorno a ciò che gestisce gli arresti anomali di JVM agli arresti anomali in codice nativo fuori dal tuo controllo, ecc. Io uso YAJSW che sta per "Yet Another Java Service Wrapper" che è una variazione open source del prodotto di Tanuki. Fa un sacco di cose, ma la cosa principale che fa è assicurarsi che il tuo processo venga riavviato almeno se si blocca o si blocca.

    
risposta data 07.03.2016 - 22:05
fonte

Leggi altre domande sui tag