Prima di tutto alcune informazioni di base
La mia azienda ha un software come modello di servizio in cui le persone accedono ai nostri server e lavorano. Per supportare questa applicazione, abbiamo un'applicazione di utilità che vive sul computer client e copia i dati binari dai nostri server alle loro macchine.
La prima iterazione di questo software ha interrogato il database e poi ha generato le informazioni sul lato client. Questo approccio è stato eliminato perché pensavamo là dove c'erano alcuni difetti fondamentali
- Sondare il database per vedere se è stato fatto qualsiasi lavoro
- Aprendo la nostra porta SQL al mondo
- Estrarre tutti i dati dal database e generarli sul lato client.
La nostra seconda iterazione del software ha generato i dati su uno dei nostri server e l'abbiamo inviata al client tramite il servizio di messaggistica Java. I vantaggi sono visti come
- Event Driven
- Nessun sondaggio
- La porta SQL è chiusa
- I dati non vengono generati sulla WAN
Quanto sopra è per illustrare gli approcci che abbiamo usato in passato.
Il problema che abbiamo è che i nostri client hanno spesso scarsa connettività (perdita di pacchetti, tempi di risposta scadenti, ecc.) JMS doveva gestirlo come dovrebbe riconnettersi quando la linea ritorna, ma questo non accade sempre .
Quali sono gli approcci migliori per gestire la scarsa connettività client?
Modifica
Per spiegare cosa intendo per JMS che non funziona come previsto.
La mia aspettativa per JMS è che funzioni in modo affidabile. Quello che intendo con questo è che se una linea va giù, o sta perdendo pacchetti, o se si comporta in modo anomalo in qualsiasi altro modo che l'implementazione JMS continuerà a provare a inviare il messaggio fino a quando non riesce.
Ad esempio, vedo quasi ogni giorno una coda JMS con utenti collegati, ma nessun messaggio viene inviato o ricevuto, il riavvio del client normalmente risolve il problema.
Posso parlare di più specifiche, tuttavia nell'interesse di questa conversazione lasciamo uscire JMS come potenziale risposta
EDIT 2
Volevo altre possibili soluzioni al mio problema, ma il consenso generale sembra essere che il mio attuale (JMS) sia il migliore.
Quindi qui ci sono 2 dei miei casi attuali in cui sto riscontrando problemi con JMS
Caso 1
Il client si connette alla coda con successo invia e riceve più messaggi, dopo un tempo variabile (tra diverse ore e diversi giorni) il client non riceve più alcun messaggio. La coda principale mostra gli utenti connessi, ma il client non riceve mai i messaggi. La risoluzione è riavviare l'applicazione client
Caso 2
Il client non si connette mai alla coda. Il client tenta continuamente di riconnettersi ma la riconnessione fallisce sempre. La soluzione per questo è riprovare tra qualche ora
La nostra configurazione è abbastanza semplice
- Un server pubblico
- OpenMQ
- I client sono a basso volume, che vanno da 10 messaggi al giorno a 1000 messaggi al giorno
- I client non avviano mai una "conversazione di messaggi", la coda viene avviata e i client rispondono
- I messaggi sono piccoli, tutto testo puro, nessun dato binario
-
config è la seguente:
connectionFactory = new ConnectionFactory(); connectionFactory.setProperty(ConnectionConfiguration.imqAddressList, connectionURL); connectionFactory.setProperty(ConnectionConfiguration.imqReconnectEnabled, "true"); connectionFactory.setProperty(ConnectionConfiguration.imqPingInterval, "30"); connectionFactory.setProperty(ConnectionConfiguration.imqReconnectAttempts, "-1"); connectionFactory.setProperty(ConnectionConfiguration.imqReconnectInterval, "30000");