Ziarna procesów roboczych bezstanowych
Domyślnie środowisko uruchomieniowe Orleans tworzy nie więcej niż jedną aktywację ziarna w klastrze. Jest to najbardziej intuicyjne wyrażenie modelu wirtualnego aktora z każdym ziarnem odpowiadającym jednostce z unikatowym typem/tożsamością. Istnieją jednak również przypadki, w których aplikacja musi wykonywać funkcjonalne operacje bezstanowe, które nie są powiązane z określoną jednostką w systemie. Jeśli na przykład klient wysyła żądania ze skompresowanymi ładunkami, które muszą zostać zdekompresowane, zanim będzie można je skierować do docelowego ziarna do przetwarzania, taka logika dekompresji/routingu nie jest powiązana z określoną jednostką w aplikacji i może łatwo skalować w poziomie.
StatelessWorkerAttribute Gdy element jest stosowany do klasy ziarna, wskazuje Orleans środowisko uruchomieniowe, że ziarna tej klasy powinny być traktowane jako bezstanowe ziarna procesów roboczych. Bezstanowe ziarna procesów roboczych mają następujące właściwości, które sprawiają, że ich wykonywanie różni się zupełnie od zwykłych klas ziarna.
- Środowisko Orleans uruchomieniowe może i utworzy wiele aktywacji bezstanowego ziarna procesu roboczego na różnych silosach klastra.
- Żądania wysyłane do bezstanowych ziarna procesów roboczych są wykonywane lokalnie, o ile silos jest zgodny i dlatego nie będą ponosić kosztów sieci ani serializacji. Jeśli lokalny silos nie jest zgodny, żądania są przekazywane do zgodnego silosu.
- Środowisko Orleans uruchomieniowe automatycznie tworzy dodatkowe aktywacje bezstanowego ziarna procesu roboczego, jeśli już istniejące są zajęte.
Maksymalna liczba aktywacji bezstanowego ziarna procesu roboczego tworzonego przez środowisko uruchomieniowe jest domyślnie ograniczona przez liczbę rdzeni procesora CPU na maszynie, chyba że określono jawnie argument opcjonalny
maxLocalWorkers
. - Ze względu na 2 i 3 bezstanowe aktywacje ziarna procesu roboczego nie są indywidualnie adresowalne. Dwa kolejne żądania do bezstanowego ziarna procesów roboczych mogą być przetwarzane przez różne aktywacje.
Bezstanowe ziarna procesów roboczych zapewniają prosty sposób tworzenia automatycznie zarządzanej puli aktywacji ziarna, która automatycznie skaluje się w górę i w dół na podstawie rzeczywistego obciążenia. Środowisko uruchomieniowe zawsze skanuje pod kątem dostępnych bezstanowych aktywacji ziarna procesu roboczego w tej samej kolejności. W związku z tym zawsze wysyła żądania do pierwszej bezczynnej aktywacji lokalnej, którą może znaleźć i jest pobierany tylko do ostatniego, jeśli wszystkie poprzednie aktywacje są zajęte. Jeśli wszystkie aktywacje są zajęte, a limit aktywacji nie został osiągnięty, tworzy jeszcze jedną aktywację na końcu listy i wysyła do niego żądanie. Oznacza to, że po wzroście szybkości żądań do bezstanowego ziarna procesu roboczego, a istniejące aktywacje są obecnie zajęte, środowisko uruchomieniowe rozszerza pulę swoich aktywacji do limitu. Z drugiej strony, gdy obciążenie spadnie i może być obsługiwane przez mniejszą liczbę aktywacji bezstanowego ziarna procesów roboczych, aktywacje na ogonie listy nie będą wysyłane do nich. Staną się bezczynne i ostatecznie zdezaktywowane przez standardowy proces zbierania aktywacji. W związku z tym pula aktywacji zostanie ostatecznie zmniejszona, aby dopasować je do obciążenia.
W poniższym przykładzie zdefiniowano bezstanową klasę MyStatelessWorkerGrain
ziarna procesu roboczego z domyślnym maksymalnym limitem liczby aktywacji.
[StatelessWorker]
public class MyStatelessWorkerGrain : Grain, IMyStatelessWorkerGrain
{
// ...
}
Wykonywanie wywołania do bezstanowego ziarna procesów roboczych jest takie samo jak w przypadku każdego innego ziarna.
Jedyną różnicą jest to, że w większości przypadków jest używany pojedynczy identyfikator ziarna, na przykład 0
lub Guid.Empty.
W przypadku wielu bezstanowych pul ziarna procesów roboczych można używać wielu identyfikatorów ziarna ziarna, jeden na identyfikator jest pożądany.
var worker = GrainFactory.GetGrain<IMyStatelessWorkerGrain>(0);
await worker.Process(args);
Ten definiuje bezstanową klasę ziarna procesu roboczego bez aktywacji więcej niż jedno ziarno na silos.
[StatelessWorker(1)] // max 1 activation per silo
public class MyLonelyWorkerGrain : ILonelyWorkerGrain
{
//...
}
Należy pamiętać, że StatelessWorkerAttribute nie zmienia ponownej enentrancy klasy ziarna docelowego. Podobnie jak w przypadku innych zbóż, bezstanowe ziarna procesów roboczych są domyślnie niezgodne. Można je jawnie wprowadzić ponownie, dodając element ReentrantAttribute do klasy ziarna.
Stan
Część "bezstanowa" "bezstanowego procesu roboczego" nie oznacza, że bezstanowy proces roboczy nie może mieć stanu i jest ograniczony tylko do wykonywania operacji funkcjonalnych. Podobnie jak każde inne ziarno, bezstanowe ziarno procesów roboczych może ładować i przechowywać w pamięci dowolny stan, którego potrzebuje. Jest to tylko spowodowane tym, że wiele aktywacji bezstanowego ziarna procesów roboczych można utworzyć na tym samym i różnych silosach klastra, nie ma łatwego mechanizmu koordynowania stanu przechowywanego przez różne aktywacje.
Kilka przydatnych wzorców obejmuje stan przechowywania bezstanowego procesu roboczego.
Skalowane w poziomie elementy gorącej pamięci podręcznej
W przypadku elementów gorącej pamięci podręcznej, które mają wysoką przepływność, przechowywanie każdego takiego elementu w bezstanowym ziarnie procesu roboczego sprawia, że:
- Automatyczne skalowanie w poziomie w silosie i we wszystkich silosach w klastrze oraz;
- Udostępnia dane zawsze lokalnie na silosie, który odebrał żądanie klienta za pośrednictwem bramy klienta, dzięki czemu żądania mogą być odbierane bez dodatkowego przeskoku sieciowego do innego silosu.
Zmniejsz agregację stylu
W niektórych scenariuszach aplikacje muszą obliczyć niektóre metryki we wszystkich ziarnach określonego typu w klastrze i okresowo zgłaszać agregacje. Przykłady to raportowanie kilku graczy na mapę gry, średni czas trwania wywołania VoIP itp. Jeśli każda z wielu tysięcy lub milionów ziarna miała zgłosić swoje metryki do jednego globalnego agregatora, agregator natychmiast zostanie przeciążony nie może przetworzyć powodzi raportów. Alternatywną metodą jest przekształcenie tego zadania w krok 2 (lub więcej), aby zmniejszyć agregację stylów. Pierwsza warstwa agregacji jest wykonywana przez raportowanie ziarna wysyłania metryk do bezstanowego procesu roboczego przed agregacją ziarna. Środowisko Orleans uruchomieniowe automatycznie utworzy wiele aktywacji bezstanowego ziarna procesu roboczego z każdym silosem. Ponieważ wszystkie takie wywołania będą przetwarzane lokalnie bez zdalnych wywołań ani serializacji komunikatów, koszt takiej agregacji będzie znacznie mniejszy niż w przypadku zdalnym. Teraz każda z wstępnie agregacji bezstanowych aktywacji ziarna procesu roboczego, niezależnie lub w koordynacji z innymi aktywacjami lokalnymi, może wysyłać swoje zagregowane raporty do globalnego końcowego agregatora (lub do innej warstwy redukcji, jeśli jest to konieczne) bez przeciążenia.