Ho una coda di lavoro (utilizzando Amazon SQS) che trasferisce i lavori a molte macchine per il recupero e l'elaborazione di vari documenti su HTTP. Ci sono centinaia di host diversi a cui si accede e non esiste un ordine prevedibile per i lavori.Metodo per coda di lavoro auto-riorganizzante
Per essere educato, non voglio che il mio sistema martello ripetutamente su un singolo host. Quindi, se ottengo un lavoro # 123 per recuperare qualcosa da example.com, ma vedo che ho recuperato un'altra cosa da esempio.com negli ultimi X secondi, dovrei passare a qualcos'altro e salvare il lavoro # 123 per dopo.
La domanda è: qual è un buon modo per implementare questo modello?
Sembra che il primo passo consista nel far sì che i responsabili del lavoro mantengano una lista da qualche parte di tutti i domini e l'ultima volta che è stato effettuato l'accesso a qualcosa su quel dominio. Suppongo che potrebbe essere una semplice tabella DB.
Ci sono quindi molte opzioni possibili su cosa fare se un elaboratore di messaggi ottiene un lavoro che deve essere rinviato.
Basta spingere una copia del messaggio verso la fine della coda e buttarla via senza eseguirla. Spero che, per la prossima volta, sia passato abbastanza tempo. Ciò può causare molti messaggi SQS ridondanti, soprattutto se un grande gruppo di lavori per lo stesso dominio passa in una sola volta.
Dormire per molti secondi è necessario fino a quando la cortesia impone che il lavoro possa essere eseguito. Ciò può causare molti processori di coda che non fanno nulla contemporaneamente.
Accettare il lavoro, ma salvarlo in una coda locale da qualche parte su ciascun processore di coda. Immagino che ogni processore possa "rivendicare" un certo numero di lavori in questo modo, e quindi scegliere di elaborarli in qualsiasi ordine raggiunga la massima cortesia. Questo può essere ancora imprevedibile, perché ogni processore di coda deve essere consapevole dei domini colpiti da tutti gli altri.
Stabilire code separate per ogni dominio e disporre di un processo dedicato a ciascuna coda. Ogni processo dovrebbe essere messo in pausa per X secondi tra l'esecuzione di ogni lavoro, quindi c'è un sacco di sovraccarico del processo di sonno, ma forse questa non è una cosa così brutta.
Hai qualche esperienza con la progettazione di questo genere di cose? Quale strategia consiglieresti?
Sei bloccato al 100% su SQS? Ci sono buoni progetti che NON ti costringono a fare una soluzione per dominio, ma richiedono un controllo diretto della coda che presumo che SQS non fornisca (per essere precisi, possibilità di "sfogliare" la coda senza prendere il comando elemento, e possibilità di prendere l'elemento Nth anziché il top - in pratica, trattando la coda come una lista doppiamente collegata senza inserimento e non una coda pura). – DVK