Condividi tramite


Bilanciamento del carico

Il bilanciamento del carico, in senso generale, è uno dei pilastri del Orleans runtime. Il Orleans runtime tenta di mantenere tutto bilanciato, poiché il bilanciamento ottimizza l'utilizzo delle risorse, evita hotspot, porta a prestazioni migliori e contribuisce all'elasticità. Il bilanciamento del carico in Orleans si applica in più posizioni. Di seguito è riportato un elenco non esaustivo dei casi in cui il runtime esegue il bilanciamento:

  1. La strategia di posizionamento dell'attore predefinita è casuale; le nuove attivazioni vengono posizionate in modo casuale tra silo. Ciò comporta un posizionamento bilanciato e impedisce hotspot per la maggior parte degli scenari.
  2. Una strategia più avanzata ActivationCountBasedPlacement tenta di equalizzare il numero di attivazioni su tutti i silo, generando una distribuzione più uniforme tra silo. Questo è particolarmente importante per l'elasticità.
  3. Il servizio directory granulare si basa su una tabella hash distribuita, che è intrinsecamente bilanciata. Il servizio directory mappa i grani alle attivazioni. Ogni silo appartiene alla tabella di mapping globale e questa tabella viene partizionata a livello globale in modo bilanciato in tutti i silo usando hash coerenti con bucket virtuali.
  4. I client si connettono a tutti i gateway e distribuiscono le richieste tra loro in modo bilanciato.
  5. Il servizio di promemoria è un servizio di runtime distribuito e partizionato. L'assegnazione di quale silo è responsabile di servire quale promemoria è bilanciata tra tutti i silos tramite hash coerente, proprio come l'elenco dei granai.
  6. I componenti critici per le prestazioni all'interno di un silo vengono partizionati e il lavoro tra di essi viene bilanciato localmente. In questo modo il runtime silo può utilizzare completamente tutti i core della CPU disponibili ed evitare colli di bottiglia all'interno del silo. Questo vale per tutte le risorse locali: allocazione del lavoro a thread, socket, compiti di distribuzione, code e così via.
  7. Il QueueBalancerBase bilancia la responsabilità di prelevare gli eventi dalle code di persistenza tra i silos nel cluster.

Il bilanciamento non significa necessariamente perdita di località. È possibile ottenere un equilibrio mantenendo comunque una buona località. Ad esempio, quando il bilanciamento comporta lo sharding o il partizionamento, è possibile assegnare la responsabilità di una determinata attività logica, mantenendo allo stesso tempo la località all'interno di ogni partizione. Questo vale sia per il bilanciamento locale che per quello distribuito.