Personalmente non mi piace un approccio self-service, IMHO è molto più difficile gestire in modo affidabile la distribuzione dei compiti tra i nodi con un'intelligenza distribuita poiché la logica locale non ha la visione globale del sistema per le sue decisioni. Ridistribuire le entità quando vengono aggiunti nuovi nodi è solo un esempio.
L'apparente scalabilità del sistema che avrebbe potuto essere la ragione per scegliere tale approccio è solo un'illusione - la necessità di un registro centralizzato della proprietà ne è un indicatore, gestirlo in modo affidabile in maniera distribuita non è un compito banale, i glitch potrebbero causare lavori bloccati / dimenticati / persi. Il recupero degli errori è difficile, il nodo del gestore centralizzato è ancora necessario poiché l'intelligence locale potrebbe scomparire.
In ogni modo ...
Da quando lo hai menzionato
once an entity is assigned to particular node, it is taken to
completion through that node only
la chiave per consentire ai nuovi nodi di prelevare parte del carico complessivo è quella di non distribuire le entità ai nodi finché non sono in grado di avviarsi immediatamente e completare la loro elaborazione comodamente all'interno delle loro capacità di caricamento . In altre parole, non creare code di attesa locali per ogni nodo poiché le entità potrebbero essere in attesa mentre altri nodi potrebbero facilmente elaborarle immediatamente. E non sovraccaricare i nodi solo per mantenere piccoli i tempi di attesa. Mantenere le entità non assegnate le rende disponibili per ogni nodo da raccogliere: una singola coda di attesa per il sistema.
Per quanto riguarda il bilanciamento del carico tra i nodi, è importante riflettere il carico del nodo nella logica di distribuzione locale. Un modo per ottenerlo senza conoscere con precisione i carichi di tutti gli altri nodi nel sistema è quello di "codificare" il carico del nodo locale nella frequenza di polling della coda in attesa.
Ad esempio, un nodo che ha già 3 entità assegnate controlla le entità disponibili una volta ogni 3 secondi, mentre un nodo con 10 entità assegnate esegue il polling solo una volta ogni 10 secondi. Ciò consente ai nodi con carichi più leggeri di raccogliere le entità più velocemente, raggiungendo così gli altri nodi: un nodo appena aggiunto sarebbe in grado di raccogliere 4 entità nello stesso intervallo in cui un nodo che sta già processando 10 entità potrebbe prenderne solo uno. Il carico complessivo del sistema verrebbe quindi automaticamente bilanciato su tutti i nodi disponibili (quando tutti i nodi raggiungono lo stesso tasso di polling).