Lavoro su un'applicazione Web che è un'applicazione basata su multi-tenant basata su cloud (molti client, ognuno con il proprio "ambiente" separato, ma tutti su set di hardware condivisi) e stiamo introducendo la possibilità per un utente di raggruppare il lavoro per l'elaborazione successiva. Il tipo di lavoro in batch non è davvero importante, è solo una quantità sufficiente che farlo senza una coda di lavoro non è davvero pratico. Abbiamo selezionato RabbitMQ come struttura della coda sottostante.Pool di lavoratori e code multi-tenant con RabbitMQ
Poiché siamo un'app multi-tenant, non vogliamo necessariamente che i client siano in grado di causare lunghi tempi di elaborazione della coda per un altro client, quindi l'idea che abbiamo messo a punto è creare una coda su un base client e con un pool di lavoro condiviso puntato su TUTTE le code dei nostri client. Il problema è che, al meglio che posso immaginare, i lavoratori sono direttamente legati a una coda specifica, non a uno scambio. Nel nostro mondo ideale, le code dei nostri clienti verranno ancora elaborate, senza che un client ne blocchi un'altra, da un pool di lavoro condiviso che possiamo aumentare o ridurre, se necessario, avviando più lavoratori o chiudendo quelli inattivi. Avere lavoratori legati a una coda specifica ci impedisce di farlo in senso pratico, dato che spesso ci sono molti lavoratori in attesa su una coda senza attività.
Esiste un modo relativamente semplice per raggiungere questo obiettivo? Sono abbastanza nuovo su RabbitMQ e non sono stato in grado di realizzare ciò che cercavamo. Inoltre, non vogliamo dover scrivere un'applicazione per il multithreading molto complessa, è una perdita di tempo in dev e tempo di test che probabilmente non possiamo permetterci. Il nostro stack è basato su Windows/.Net/C# se si tratta di germaine, ma non penso che questo dovrebbe avere un ruolo importante nella domanda in questione.
Non sto chiedendo sull'assegnazione di più lavoratori alla stessa coda, sto chiedendo il contrario. Voglio un pool finito di lavoratori per consumare da un grande (chiamiamolo ~ 500) numero di code. – bakasan
Ho sperimentato in prima persona questo tipo di approccio e non è bello: è difficile trovare un'euristica adeguata per elaborare tutte queste code. Elaborate prima le code più complete? O quelli con i vecchi messaggi? In entrambi i casi, sei fuori dal protocollo AMQP e devi iniziare a gestire l'API di gestione dei conigli. Poi pensi: abbiamo lo stesso numero di code dei lavoratori e aggiungi una mappatura hash coerente tra 500 Q e le code di lavoro. Poi ti rendi conto che una sola fila e tutti i lavoratori in competizione sono tutto ciò di cui hai bisogno. –
Ho un requisito simile, tuttavia desidero garantire che i messaggi di un determinato cliente vengano elaborati in sequenza. Un contatto non viene eliminato prima della sua creazione, ecc. Esiste qualche configurazione o configurazione di RabbitMQ che può farlo, pur condividendo la coda tra i lavoratori? (È una nuova Q ...?) – Aaron