2013-03-23 11 views
6

Ho un'applicazione HTTP con operatori autonomi che funzionano bene. Il problema è che alcune volte hanno bisogno di eliminare e ricostruire le loro cache, quindi smettono di rispondere per un massimo di 30 secondi.Ricerca di un bus di messaggi per la condivisione del carico HTTP

Ho esaminato un certo numero di bilanciatori di carico, ma nessuno di essi sembra risolvere questo problema. Ho provato Perlbal e alcuni moduli Apache (come fcgid) e inviano volentieri richieste ai lavoratori che sono impegnati nella ricostruzione della loro cache.

Quindi la mia opinione è questa: non esiste una soluzione di bus di messaggi in cui tutte le richieste http vengono accodate, lasciando agli operatori l'elaborazione dei messaggi quando sono in grado di farlo?

Oppure - in alternativa - un bilanciamento del carico che può tenere conto del fatto che i lavoratori sono a volte in grado di rispondere.

aggiunto in seguito: Sono consapevole del fatto che una strategia potrebbe essere che i lavoratori potrebbero utilizzare un protocollo di gestione per informare il bilanciamento del carico quando sono occupati, ma questa soluzione sembra kludgy e temo che ci saranno alcuni casi limite ciò si traduce in errori spuri.

+0

In realtà ho ho appena trovato il progetto Mongrel2 che promette qualcosa di molto simile a quello che ho descritto sopra, ma sono un po 'scoraggiato dal fatto che la loro ultima versione (1.8) sembra essere instabile (vedi il loro numero # 148) e che il loro master non ha stato aggiornato per 6 mesi. – mzedeler

+0

Si consiglia di prendere in considerazione la possibilità di modificare la strategia della cache e utilizzare una LRU che si espelle automaticamente o qualcosa del genere. Se una eliminazione/rigenerazione ti fa perdere tutto per 30 secondi, c'è qualcosa di sbagliato nel modo in cui lo stai usando. – Kylar

+0

@Kylar: Sono d'accordo sul fatto che 30 secondi siano troppo lunghi, ma a partire da ora quella parte è molto difficile da cambiare. – mzedeler

risposta

2

Vedo qui due strategie: mettere un operatore offline per il periodo, quindi un bilanciatore lo abbandonerà; controllo inverso - i lavoratori trascinano le attività da un sistema di bilanciamento, invece che il sistema di bilanciamento spinge i compiti ai lavoratori. Seconda strategia facile da fare con una coda di messaggi.

+0

La prima strategia sembra non funzionare perché i bilanciatori proveranno a inviare richieste ai lavoratori, anche quando sono offline. Forse il bilanciatore sarà veloce ad abbandonare il lavoratore, ma anche se il timeout è di pochi secondi, sarebbe un ritardo significativo (leggi: inaccettabile). La soluzione del bus dovrebbe funzionare. La taglia è data a chiunque possa indicarmi la direzione delle tecnologie esistenti e funzionanti che lo fanno. – mzedeler

+0

@mzedeler I bilanciatori consentono di mantenere elenchi di lavoratori, quindi è sufficiente annullare la registrazione di un worker prima della ricostruzione della cache. – kan

+0

Questo è quello che ho deciso di fare per ora, ma ha un cattivo design, dal momento che devo affrontare alcune condizioni di gara che sono molto difficili da mitigare completamente a causa dell'ambiente, sto usando (single threaded con un ciclo di eventi che Non ho il controllo di). – mzedeler

5

Se si utilizza il servizio di bilanciamento del carico di Amazon Web Services, è possibile ottenere il risultato desiderato. È possibile contrassegnare un'istanza EC2 dietro a un Elastic Load Balancer (ELB) come non salutare mentre esegue l'eliminazione e la ricostruzione della cache.

Quello che vorrei fare è creare un endpoint aggiuntivo per ogni istanza, ad esempio rebuild_cache. Quindi, se hai 5 istanze dietro il tuo ELB, puoi fare in modo che uno script colpisca ogni singola istanza (non attraverso il load balancer) su quell'endpoint rebuild_cache. Questo endpoint farebbe 3 cose:

  1. Contrassegnare l'istanza come non salutare. Il bilanciamento del carico si renderà conto che non è salutare dopo un controllo dello stato non riuscito (i tempi e la soglia dei controlli di integrità sono configurabili da AWS Web Console).
  2. Eseguire l'eliminazione della cache e rigenerare
  3. Contrassegnare l'istanza come integra. Il bilanciamento del carico eseguirà un controllo dello stato sull'istanza e inizierà a inviarlo solo quando sarà salito per la quantità richiesta di controlli sanitari sani (anche questa soglia viene definita tramite la configurazione ELB Health)
+0

Lascerò che il sistema di taglie ti conceda metà della taglia. La ragione per cui non sto assegnando l'intera generosità è che non stai davvero puntando a nessuna tecnologia di messaggistica che soddisfi i requisiti indicati dalla domanda. Ma a parte questo, apprezzo il tuo contributo. – mzedeler

+0

Grazie, sì, questo è sicuramente entrato nella sezione "alternativamente" del tuo post. Ho pensato di fornire input poiché ho questo set esatto e funziona benissimo. – Drewch

Problemi correlati