Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Orleans gwarantuje, że po wywołaniu ziarna wystąpienie tego ziarna jest dostępne w pamięci na niektórych serwerach w klastrze w celu obsługi żądania. Jeśli ziarno nie jest obecnie aktywne w klastrze, Orleans wybiera serwer do aktywowania ziarna. Ten proces jest nazywany umieszczaniem ziarna. Umieszczanie jest również jednym ze sposobów Orleans równoważenia obciążenia: równomierne umieszczenie zajętych ziaren pomaga rozłożyć obciążenie w całym klastrze.
Proces umieszczania w Orleans jest w pełni konfigurowalny. Wybierz spośród wbudowanych zasad umieszczania, takich jak losowe, preferowane lokalnie i oparte na obciążeniu, lub skonfiguruj logikę niestandardową. Dzięki temu można w pełni elastycznie decydować, gdzie tworzone są ziarna. Na przykład umieść ziarna na serwerze w pobliżu zasobów, na których muszą pracować, lub blisko innych ziaren, z którymi się komunikują. Domyślnie Orleans wybiera losowy serwer zgodny.
Skonfiguruj strategię rozmieszczania Orleans używaną globalnie lub dla każdej klasy ziarna.
Losowe umieszczanie
Orleans losowo wybiera serwer z zgodnych serwerów w klastrze. Aby skonfigurować tę strategię umieszczania, dodaj element RandomPlacementAttribute do klasy ziarna.
Umieszczanie lokalne
Jeśli serwer lokalny jest zgodny, Orleans wybiera serwer lokalny. W przeciwnym razie wybiera losowy serwer. Skonfiguruj tę strategię umieszczania, dodając element PreferLocalPlacementAttribute do klasy ziarna.
Umieszczanie oparte na haszach
Orleans przekształca identyfikator ziarna w nieujemną liczbę całkowitą i wykonuje operację modulo liczby zgodnych serwerów. Następnie wybiera odpowiedni serwer z listy zgodnych serwerów uporządkowanych według adresu serwera. Należy pamiętać, że nie ma gwarancji, że to umiejscowienie pozostanie stabilne wraz ze zmianami członkostwa w klastrze. W szczególności dodawanie, usuwanie lub ponowne uruchamianie serwerów może zmienić serwer wybrany dla danego identyfikatora ziarna. Ponieważ ziarna umieszczone przy użyciu tej strategii rejestrują się w katalogu ziarna, zmiana decyzji dotyczącej umieszczania w miarę jak członkostwo się zmienia, zazwyczaj nie ma zauważalnego efektu.
Skonfiguruj tę strategię umieszczania, dodając element HashBasedPlacementAttribute do klasy ziarna.
Umieszczanie na podstawie liczby aktywacji
Ta strategia umieszczania próbuje umieścić nowe aktywacje ziaren na najmniej mocno obciążonym serwerze na podstawie liczby ostatnio zajętych ziaren. Obejmuje on mechanizm, w którym wszystkie serwery okresowo publikują łączną liczbę aktywacji na wszystkich innych serwerach. Następnie dyrektor umieszczania wybiera serwer, który przewiduje, że ma najmniej aktywacji, sprawdzając ostatnio zgłoszoną liczbę aktywacji i przewidując bieżącą liczbę na podstawie ostatnich aktywacji dokonanych przez dyrektora umieszczania na bieżącym serwerze. Dyrektor wybiera kilka serwerów losowo podczas przewidywania, aby uniknąć przeciążenia wielu oddzielnych serwerów tego samego serwera. Domyślnie dwa serwery są wybierane losowo, ale tę wartość można skonfigurować za pomocą polecenia ActivationCountBasedPlacementOptions.
Ten algorytm opiera się na tezie The Power of Two Choices in Randomized Load Balancing (Moc dwóch wyborów w losowym równoważeniu obciążenia ) michaela Davida Mitzenmachera. Jest on również używany w Nginx do równoważenia obciążenia rozproszonego, zgodnie z opisem w artykule NGINX i "Power of Two Choices" Load-Balancing Algorithm.
Skonfiguruj tę strategię umieszczania, dodając element ActivationCountBasedPlacementAttribute do klasy ziarna.
Umieszczanie bezstanowych pracowników
Strategia umieszczania bezstanowych procesów roboczych to specjalna metoda używana przez bezstanowi pracownicy ziarna. Rozmieszczenie działa niemal identycznie jak PreferLocalPlacement
, z wyjątkiem tego, że każdy serwer może mieć wiele aktywacji tego samego ziarna, a ziarno nie jest zarejestrowane w katalogu ziaren, ponieważ nie ma takiej potrzeby.
Skonfiguruj tę strategię umieszczania, dodając element StatelessWorkerAttribute do klasy ziarna.
Umieszczanie oparte na rolach w silosie
Jest to deterministyczna strategia umieszczania ziarna na silosach z określoną rolą. Skonfiguruj tę strategię umieszczania, dodając element SiloRoleBasedPlacementAttribute do klasy ziarna.
Umieszczanie zoptymalizowane pod kątem zasobów
Strategia optymalizacji rozmieszczenia zasobów dąży do optymalizacji zasobów klastra, równoważąc aktywacje ziaren między silosami na podstawie dostępnej pamięci i użycia procesora. Przypisuje wagi do statystyk środowiska uruchomieniowego w celu nadania priorytetów różnym zasobom i oblicza znormalizowany wynik dla każdego silosu. Silos o najniższym wyniku jest wybierany do umieszczenia nadchodzącej aktywacji. Normalizacja zapewnia, że każda właściwość przyczynia się proporcjonalnie do ogólnego wyniku. Dostosuj wagi w ResourceOptimizedPlacementOptions oparciu o określone wymagania i priorytety dla różnych zasobów.
Ponadto ta strategia umieszczania uwidacznia opcję utworzenia silniejszej preferencji dla lokalnego silosu (tego, który otrzymuje żądanie dokonania nowego umieszczenia), aby został wybrany jako cel aktywacji. Steruj tym za pomocą właściwości LocalSiloPreferenceMargin
, która jest częścią opcji.
Ponadto algorytm adaptacyjnyw trybie online zapewnia efekt wygładzenia, unikając szybkich spadków sygnału, przekształcając sygnał w proces rozkładu przypominającego wielomian. Jest to szczególnie ważne dla użycia procesora i ogólnie pomaga uniknąć nasycenia zasobów na silosach, szczególnie na nowo dołączonych.
Ten algorytm opiera się na rozmieszczaniu opartym na zasobach z kooperatywnym filtrowaniem Kalmana w trybie podwójnym.
Skonfiguruj tę strategię umieszczania, dodając element ResourceOptimizedPlacementAttribute do klasy ziarna.
Wybieranie strategii umieszczania
Wybranie odpowiedniej strategii umieszczania ziarna poza wartościami domyślnymi Orleans wymaga monitorowania i oceny. Wybór powinien być oparty na rozmiarze i złożoności aplikacji, charakterystyce obciążenia i środowisku wdrażania.
Umieszczanie losowe opiera się na Prawie dużych liczb, więc zwykle jest to dobra wartość domyślna dla nieprzewidywalnych obciążeń rozłożonych na wiele ziaren (10 000 lub więcej).
Umieszczanie oparte na liczbie aktywacji ma również element losowy, oparty na zasadzie Power of Two Choices. Jest to powszechnie używany algorytm do rozproszonego równoważenia obciążenia i jest używany w popularnych modułach równoważenia obciążenia. Silosy często publikują statystyki środowiska uruchomieniowego w innych silosach w klastrze, w tym:
- Dostępna pamięć, łączna ilość pamięci fizycznej i użycie pamięci.
- Użycie procesora
- Łączna liczba aktywacji i ostatnio aktywna liczba aktywacji.
- Przesuwające się okno aktywacji, aktywne w ciągu ostatnich kilku sekund, czasami nazywane zestawem roboczym aktywacji.
Z tych statystyk obecnie używane są tylko liczby aktywacji w celu określenia obciążenia dla danego silosu.
Ostatecznie poeksperymentuj z różnymi strategiami i monitoruj metryki wydajności, aby określić najlepsze dopasowanie. Wybranie odpowiedniej strategii umieszczania ziarna optymalizuje wydajność, skalowalność i opłacalność Orleans aplikacji.
Konfigurowanie domyślnej strategii umieszczania
Orleans używa losowego umieszczania, chyba że wartość domyślna zostanie zamieniona. Zastąp domyślną strategię umieszczania, rejestrując implementację PlacementStrategy podczas konfigurowania.
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Konfigurowanie strategii umieszczania dla ziarna
Skonfiguruj strategię umieszczania dla typu ziarna, dodając odpowiedni atrybut do klasy ziarna. Odpowiednie atrybuty są określone w powyższych sekcjach strategii umieszczania .
Przykładowa strategia niestandardowego umieszczania
Najpierw zdefiniuj klasę implementjącą IPlacementDirector interfejs, wymagając pojedynczej metody. W tym przykładzie założono, że funkcja GetSiloNumber
jest zdefiniowana, która zwraca liczbę silosów, biorąc pod Guid uwagę ziarno, które ma zostać utworzone.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
Następnie zdefiniuj dwie klasy, aby umożliwić przypisywanie klas ziarna do strategii:
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
Następnie oznacz wszystkie klasy ziarna przeznaczone do użycia tej strategii za pomocą atrybutu :
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Na koniec zarejestruj strategię podczas tworzenia elementu ISiloHost
:
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
Drugi prosty przykład, pokazujący dalsze użycie kontekstu umieszczania, można znaleźć, odwołując się do PreferLocalPlacementDirector
w repozytorium kodu źródłowegoOrleans.