Bilanciamento del carico
Il bilanciamento del carico, in senso generale, è uno dei pilastri del runtime di Orleans. Il runtime di Orleans tenta di rendere bilanciato l'intero carico, poiché il bilanciamento consente di ottimizzare l'utilizzo delle risorse ed evitare punti critici, contribuendo così a migliorare le prestazioni e a favorire l'elasticità. Il bilanciamento del carico in Orleans viene applicato in più posizioni. Di seguito è riportato un elenco non esaustivo di posizioni in cui il runtime esegue il bilanciamento:
- La strategia di posizionamento predefinita degli attori è casuale, poiché le nuove attivazioni vengono posizionate in modo casuale tra i silos. In questo modo, si ottiene un posizionamento bilanciato e si evitano punti critici per la maggior parte degli scenari.
- Un'istanza di ActivationCountBasedPlacement più avanzata tenta di equalizzare il numero di attivazioni su tutti i silos, consentendo così una distribuzione più uniforme delle attivazioni tra i silos. Questo è particolarmente importante per l'elasticità.
- Il servizio directory dei grani si basa su una tabella hash distribuita, che è intrinsecamente bilanciata. Il servizio directory esegue il mapping dei grani alle attivazioni, ogni silo possiede parte della tabella di mapping globale e questa tabella viene partizionata a livello globale in modo bilanciato tra tutti i silos. Per questo motivo viene usato l'hashing coerente con bucket virtuali.
- I client si connettono a tutti i gateway e distribuiscono le richieste tra di loro, in modo bilanciato.
- Il servizio di promemoria è un servizio di runtime partizionato distribuito. L'assegnazione del silo responsabile della gestione di un determinato promemoria viene bilanciata tra tutti i silos tramite hashing coerente, proprio come nella directory dei grani.
- I componenti critici per le prestazioni all'interno di un silo vengono partizionati e il lavoro fra tali componenti viene bilanciato in locale. In questo modo, il runtime del silo può usare completamente tutti i core di CPU disponibili, evitando di creare colli di bottiglia nel silo. Questo vale per tutte le risorse locali: allocazione del lavoro a thread, socket, responsabilità di invio, code e così via.
- L'oggetto QueueBalancerBase bilancia il compito di eseguire il pull degli eventi dalle code di persistenza tra i silos nel cluster.
Il bilanciamento non significa necessariamente perdita della posizione. Il bilanciamento può avvenire anche mantenendo una buona posizione. Ad esempio, quando il bilanciamento significa partizionamento orizzontale o partizionamento, è possibile partizionare il compito di svolgere una determinata attività logica, mantenendo comunque la posizione all'interno di ogni partizione. Questo vale sia per il bilanciamento locale sia per quello distribuito.