Sto mantenendo un sistema già costruito. Il sistema attuale funziona come segue:
Situazione attuale:
- Client (UI) invia una richiesta.
- Round-robin del livello Web su uno dei backend.
- Il backend accetta richieste e handle.
- Il backend può spendere millis / secondi / minuti su richiesta a seconda del lavoro che è stato chiesto di fare.
quindi diciamo
- limite del cluster globale del modello di treno - 4 (grande task) limitazione per risorsa condivisa come db. Limite del cluster globale del modello di generazione - 8 (grande attività) per risorsa condivisa come db.
Il mio piano:
Voglio fare meno lavoro e rendere questo sistema più resiliente, il che significa che non perderebbe e fallirebbe i lavori e il timeout.
- Ogni lavoro viene prima inserito in una coda, per la multitanenza una coda per ogni cliente.
- I backend prendono i lavori dalla coda in base alla loro capacità.
- Ogni volta che un back-end accetta un lavoro, lo prende dalla coda dei "prossimi" clienti per farli pagare tra loro.
Problema:
- Se il cluster gestisce già 4 modelli di treno (limite di cluster massimo) non posso svolgere più attività a lungo termine.
- Ciò significa che anche se ho diviso la mia coda in attività a esecuzione prolungata e attività di esecuzione brevi (2 code per ogni cliente anziché una), ciò significherebbe che non consumerei anche attività dalle attività a coda lunga perché una delle il tipo di attività di lunga durata ha raggiunto la capacità globale del cluster (come db è una risorsa condivisa completamente utilizzata).
Ora, se poi decido di prendere il treno e fare una coda perché è una limitazione del cluster globale difficile, avrei
- coda dei treni (attività pesante)
- generare-coda (attività pesante)
- short-queue (attività leggera).
Quindi, se avessi raggiunto il tetto massimo di 4 treni per cluster, avrei ritirato i compiti dalle altre 2 code, il problema è che se ora ho molte attività nelle code generate-queue e short-queue, allora morirò di fame in coda ai treni, vero?
C'è qualche motivo ben noto per affrontarlo?
* Nota: non riesco a cambiare l'intera architettura come se introducessi filato / scintilla, il sistema è già stato costruito e codificato in un modo in cui posso solo cambiare il modo in cui instrado le richieste. Quando lo riscrivo, lo farò, ma ora non riscriverò. Tutti i lavori sono in-process, ovvero non generano nuovi processi. (semplice java nio e alcuni multithreading).