Cosa prendere in considerazione quando si progetta un'applicazione Web che verrà distribuita in un servizio di bilanciamento del carico?

1

Attualmente sto gestendo un'applicazione web Java che inizialmente è progettata per funzionare solo come una singola istanza (non in un cluster / farm). Ora, il cliente sta pianificando di aggiornare la propria infrastruttura e parte del piano è di posizionare la nostra applicazione web dietro un sistema di bilanciamento del carico.
Ho già identificato diversi seri problemi di progettazione:

  1. Gli utenti possono caricare file e la nostra applicazione memorizza quei file nel filesystem locale.
  2. Esistono lavori pianificati che potrebbero causare problemi se eseguiti simultaneamente (cioè generando file).
  3. Le variabili di sessione sono molto utilizzate nella maggior parte dei moduli.


Ho bisogno di un'opinione sulle mie soluzioni proposte di seguito.

  1. Posso risolvere l'articolo 1 memorizzando tutti i file in un archivio esterno / condiviso (SAN, ecc.)
  2. Con l'elemento 2, posso creare un meccanismo di blocco nel database in modo che quando i lavori pianificati vengano eseguiti, le app Web controllino prima la tabella e solo il primo ad aggiornare eseguirà il suddetto lavoro.
  3. In realtà, non sono ancora sicuro se l'elemento 3 possa causare problemi. Se un utente accede alla nostra applicazione e il bilanciamento del carico lo indirizza al Server 1, è possibile che il servizio di bilanciamento del carico lo indirizzerà al Server 2 la volta successiva che farà clic su un collegamento? Non ho ancora idea di come funziona il bilanciamento del carico in questo livello.

Inoltre, quali sono le altre cose che dovrei prendere in considerazione quando si progetta un'applicazione web scalabile orizzontale [da zero]?

    
posta Sergio 23.11.2013 - 01:59
fonte

1 risposta

3

Users can upload files and our application store those files in the local filesystem.
I can solve item 1 by storing all files in an external/shared storage (SAN, etc..)

La memorizzazione delle risorse statiche comuni su un sistema esterno accessibile a tutti è certamente un modo per affrontare il problema degli utenti che caricano file che devono essere salvati. Questo riduce molti problemi e ignora completamente il brutto problema di cercare di sincronizzare i file system locali (non andare giù per questa strada, porta solo alla follia).

There are scheduled jobs that might cause problems when executed concurrently (i.e. generating files).
With item 2, I can create a locking mechanism in the database so when the scheduled jobs run, the web apps will first check the table and only the first one to update will run the said job.

Affrontare i lavori programmati che scrivono dati "statici", si entra in qualche altra brutta situazione.

La prima cosa da considerare è che cosa stanno generando? Se stanno generando altri file di dimensioni ridotte, perché non memorizzare invece i dati generati nel database. Questo risolve anche il problema del "blocco" in una certa misura (nel senso che lo scarica nel database). Quindi, l'applicazione dovrebbe leggere i dati dal database anziché dal file system.

Quando vai su "ewww" quando pensi a un grosso database Oracle, puoi anche prendere in considerazione un database nosql più leggero. L'uso del file system per il blocco ha altri problemi che lo rendono un po 'meno desiderabile. L'utilizzo di più sistemi diversi (database e file system) non ha le stesse condizioni di gara (sono altri da considerare), ma significa anche che i due devono rimanere correttamente sincronizzati. Le gioie della rimozione dei blocchi del database quando l'applicazione termina in modo errato.

Archivia il contenuto generato nel database e dovresti essere bravo. Rende diverse cose molto più facili. Prendi in considerazione aspetti come i record con data / ora e poi seleziona il timestamp più recente che è stato fatto.

Ci sono altre cose a cui pensare qui, come avere un servizio sui server delle applicazioni che scriverà un file che proviene da un client specifico (quindi il tuo lavoro pianificato spinge il server delle applicazioni che lo scrive sul common file system) o con un sistema di messaggistica che notifica ai server delle applicazioni il nuovo contenuto in una determinata posizione che attiva un'applicazione per estrarre i dati in un file system locale.

Ci sono molti modi diversi di avvicinarsi a questo per singoli aggiornamenti che vengono spinti all'area del contenuto. Questo potrebbe essere l'argomento di una domanda completamente nuova a seconda delle specifiche del problema e dei vincoli del sistema.

Session variables are heavily used in most modules.
Actually, I'm still not sure if item 3 can cause problems. If a user logs in to our application and the load balancer directs him to Server 1, is it possible that the load balancer will point him to Server 2 the next time he click a link? I have no idea yet how the load balancer works in this level.

Il concetto chiave che stai cercando è "sessione appiccicosa". Cade sotto l'area di 'load balancer persistance'

In questo, anche il bilanciamento del carico è a conoscenza delle sessioni create e quando una richiesta di sessione arriva per un sistema, la manterrà sempre "bloccata" sul server delle applicazioni che lo ha generato.

Questo non è privo di una serie di problemi (un sistema va giù, le sessioni passano all'altra (hai failover, giusto?) e poi ritorna su, ma ora tutto il carico è bloccato all'altro server).

Comprendere che la natura esatta di questo supporto dipende dal bilanciamento del carico utilizzato. Alcuni hanno i loro cookie, alcuni usano JSESSIONID e simili, altri usano ip (e se hai un firewall / proxy di qualche tipo lì, potrebbe sembrare che tutte le richieste provengano dallo stesso ip).

Si potrebbe anche voler guardare una cache esterna per le sessioni in modo che siano condivise tra entrambe le macchine piuttosto che fare il bilanciamento del carico tra di esse. Alcuni framework hanno questo, oppure potresti guardare ad altre soluzioni di caching per percorrere questa strada. Di nuovo, forse un argomento di una nuova domanda se ci sono più informazioni sull'ambiente e sui vincoli poiché questo sta diventando ragionevolmente lungo.

    
risposta data 23.11.2013 - 02:58
fonte

Leggi altre domande sui tag