Load Balancing e failover nel codice

2

Ho dei webservices basati su HTTPS (non REST, piuttosto vecchio codice). Sto generando stub client Java usando Axis & usando quello per chiamare i servizi web. Ci sono circa 20 API diverse sul webservice.

Ho 2 server che ospitano i servizi web (identico - 2 server vengono utilizzati per la ridondanza) e i dati sono sincronizzati tra i 2 server - in modo che la stessa API chiamata server abbia lo stesso risultato).

Non ho bilanciatori di carico hardware o software o cluster.

Quindi sto pianificando di implementare il failover & loadbalancing nel codice (il failover è importante, va bene anche se non eseguo il load balancing).

Avevo intenzione di farlo in codice Ad esempio, se ottengo un'eccezione di connessione, intrappolerò l'eccezione e eseguirò la stessa chiamata Webservice sull'altro server.

Mi chiedevo se esistessero modelli di design noti per questa o altre insidie di cui dovrei essere a conoscenza.

    
posta user93353 26.09.2013 - 07:24
fonte

2 risposte

2

Quando ho letto la tua descrizione per la prima volta non ero sicuro di dove avessi pianificato di gestire l'eccezione, ma dopo la rilettura assumerò che tu stia gestendo il failover nella libreria client. Ci sono alcune librerie JMS che fanno qualcosa del genere, quindi non è un metodo irragionevole. Tuttavia, vorrei prendere in considerazione quanto segue:

  • ogni client avrà un server preferito e si scambierà solo se quel server non funziona?
  • una volta che un client sceglie un server che sta funzionando, cambierà mai?
  • se scegli un server che funziona, ti attieni a questo?

Fondamentalmente, a seconda di come rispondi a queste domande, potrei vedere tutti i client rimanere bloccati su un server se l'altro ha un piccolo inconveniente. In tal caso, hai fondamentalmente un failover, ma non il bilanciamento del carico.

Se si scambiano i server casualmente ogni richiesta, si verifica un problema di prestazioni se un server si arresta.

L'altro grosso problema che posso vedere è che se si codifica l'elenco dei server nella libreria client è difficile modificarlo. Sarebbe meglio caricare la lista da qualche parte, o non del tutto, ed è per questo che i bilanciatori di carico sono belli, in quanto nascondono completamente la lista dal client. Supponendo che si desidera mantenere l'intera implementazione nel client, farei in modo di rendere l'elenco configurabile dall'esterno della libreria. Come ho già detto, alcuni provider JMS accettano un elenco di URL separati da virgole per il server. Potresti provare qualcosa del genere, o prendere una serie di URL, o anche una configurazione JSON o simile.

Quindi non totalmente una risposta, ma alcune cose a cui pensare.

    
risposta data 26.09.2013 - 07:52
fonte
0

Suppongo anche che tu stia parlando di chiamare efficacemente l'API dal client e non dei 2 server che hai. Non è possibile eseguire il bilanciamento del carico dal lato client, perché non si conoscerà mai il carico su ciascun server, se si guarda anche al timeout della connessione o al tempo di rotazione, non si è a conoscenza del fatto che è dovuto al carico o a causa di guasti di rete. La cosa migliore è chiamare alternativamente ciascun server, se non lo si desidera affatto.

Per il failover, il suggerimento sopra riportato vale, in cui è possibile iniettare gli URL dall'esterno. Ogni volta che si verifica un errore di connessione, potrebbe non essere necessario riprovare ogni volta. invece è possibile anche disporre di un servizio ping, che esegue il ping del server ogni volta configurato e aggiorna una posizione comune sullo stato del server e quindi potrebbe aiutare a creare e connettersi al server disponibile. Altrimenti finiresti per fare una connessione sbagliata ogni volta dal tuo codice di lavoro effettivo.

    
risposta data 26.09.2013 - 11:39
fonte

Leggi altre domande sui tag