Come implementare una coda equa, per multitanente, limitazione per macchina e limitazione di cross cluster?

0

Sto mantenendo un sistema già costruito. Il sistema attuale funziona come segue:

Situazione attuale:

  1. Client (UI) invia una richiesta.
  2. Round-robin del livello Web su uno dei backend.
  3. Il backend accetta richieste e handle.
  4. 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.

  1. Ogni lavoro viene prima inserito in una coda, per la multitanenza una coda per ogni cliente.
  2. I backend prendono i lavori dalla coda in base alla loro capacità.
  3. Ogni volta che un back-end accetta un lavoro, lo prende dalla coda dei "prossimi" clienti per farli pagare tra loro.

Problema:

  1. Se il cluster gestisce già 4 modelli di treno (limite di cluster massimo) non posso svolgere più attività a lungo termine.
  2. 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

  1. coda dei treni (attività pesante)
  2. generare-coda (attività pesante)
  3. 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).

    
posta Jas 13.12.2017 - 10:20
fonte

0 risposte