2015-05-05 12 views
47

Spędzam wieczory oceniając usługę Azure Service Fabric jako zamiennik dla naszego obecnego stosu WebApps/CloudServices i nie mam pewności, jak decydować, kiedy usługi/aktorzy z państwem powinni być pełnoprawnymi aktorami oraz kiedy powinni być bezpaństwowymi aktorami z zewnętrznie utrwalonym stanem (Azure SQL, Azure Storage i DocumentDB). Wiem, że jest to całkiem nowy produkt (przynajmniej dla ogółu społeczeństwa), więc prawdopodobnie nie ma jeszcze wielu dobrych praktyk w tym zakresie, ale przeczytałem większość z documentation udostępnionych przez Microsoft bez znalezienia konkretnego odpowiedź na to.Zrozumienie, kiedy należy korzystać z usług stanowych i kiedy polegać na zewnętrznej trwałości w usłudze Azure Service Fabric

Obecna domena problemu, do której się zbliżam, to nasz magazyn zdarzeń; części naszych aplikacji bazują na źródłach zdarzeń i CQRS, a ja oceniam, jak przenieść ten sklep z wydarzeniami na platformę Service Fabric. Magazyn zdarzeń będzie zawierał wiele danych szeregów czasowych, a ponieważ jest to nasze jedyne źródło prawdy dla danych tam przechowywanych, musi być spójny, replikowany i przechowywany w pewnej formie trwałego przechowywania.

Jednym ze sposobów, który rozważałem, aby to zrobić, jest użycie stateful "EventStream"; każda instancja agregująca wykorzystująca źródło zdarzeń przechowuje swoje zdarzenia w odizolowanym strumieniu. Oznacza to, że aktywny aktor może śledzić wszystkie zdarzenia dla własnego strumienia, a ja spełniłbym moje wymagania dotyczące przechowywania danych (transakcyjne, replikowane i trwałe). Jednak niektóre strumienie mogą rosnąć bardzo duże (setki tysięcy, jeśli nie miliony zdarzeń), i to jest, gdzie zaczynam być niepewny. Posiadanie aktora z dużą ilością państwa będzie, jak sądzę, wpływać na wydajność systemu, gdy te duże modele danych będą wymagały serializowania lub deserializacji z dysku.

Inną opcją jest uniemożliwienie tym aktorom bezpaństwowości i sprawienie, by po prostu odczytali swoje dane z zewnętrznej pamięci masowej, takiej jak Azure SQL - lub po prostu skorzystali z usług bezpaństwowych zamiast aktorów.

Zasadniczo, kiedy jest stan dla aktora/usługi "za dużo" i należy zacząć rozważać inne sposoby postępowania z państwem?

Ponadto, ta sekcja w dokumentacji Service Fabric Actors design pattern: Some anti-patterns zostawić mnie trochę zaskoczony:

Treat Azure Usługa Fabric Actors jako systemu transakcyjnego. Azure Service Fabric Actors nie jest systemem opartym na zatwierdzaniu dwufazowym, oferującym ACID. Jeśli nie zastosujemy opcjonalnej trwałości, a maszyna, w której aktor działa na matrycach, jej aktualny stan będzie z nią związany. Aktor będzie bardzo szybko pojawiał się w innym węźle, ale jeśli nie zaimplementujemy trwałości podkładu, stan zniknie. Jednak między wykorzystaniem prób, podwójnym filtrowaniem i/lub idempotencjalnym projektem można osiągnąć wysoki poziom niezawodności i spójności.

Co oznacza "jeśli nie wdrożymy opcjonalnego utrzymania" tutaj? Miałem wrażenie, że tak długo, jak twoja transakcja modyfikująca stan się powiedzie, twoje dane przetrwały do ​​trwałego przechowywania i replikowane do co najmniej części replik. W tym punkcie zastanawiam się, czy zdarzają się sytuacje, w których stan moich aktorów/służb ulegnie zagubieniu, i jeśli jest to coś, co muszę poradzić sobie. Wrażenie, jakie dostałem od modelu stanowego w innych częściach dokumentacji wydaje się przeciwdziałać temu stwierdzeniu.

+3

masz aktualizację do tego, ja znajduję się w bardzo podobnej sytuacji zastanawiać, co skończyło się robi. Twoje zdrowie. – user299709

+0

@Trond Nordheim Czy zdecydowałeś się na rozwiązanie wykorzystujące SF? Mam podobny wymóg i byłbym zainteresowany usłyszeć, co zdecydowałeś. – Oliver

+0

Mamy do czynienia z tą samą ścieżką i mamy te same wątpliwości, przetestowaliśmy wiele narzędzi do pozyskiwania zdarzeń .NET (mementoFX, ncqrs, etc ...), ale nie jesteśmy z nich super zadowoleni (może to nasza wina), ale jesteśmy wciąż szukają jakiejś alternatywy. – MonDeveloper

Odpowiedz

22

Jedną z opcji jest zachowanie "części" stanu w aktorze (powiedzmy, co może być uznane za gorące dane, które muszą być szybko dostępne) i przechowywanie wszystkiego w "tradycyjnej" infrastrukturze pamięci masowej takie jak SQL Azure, DocDB, ... Trudno jest mieć ogólną regułę dotyczącą zbyt dużego lokalnego stanu, ale być może pomaga ona myśleć o gorących i zimnych danych. Wiarygodni aktorzy oferują także możliwość dostosowania usługi StateProvider, aby można było również rozważyć wdrożenie dostosowanego dostawcy usługi StateProvider (poprzez wdrożenie IActorStateProvider) z określonymi zasadami, które muszą być bardziej wydajne z wymaganiami, które masz pod względem ilości danych, opóźnienie, niezawodność i tak dalej (uwaga: dokumentacja jest nadal bardzo minimalna w interfejsie StateProvider, ale możemy opublikować przykładowy kod, jeśli jest to coś, co chcesz realizować).

Informacje o szablonach antyspamowych: uwaga dotyczy raczej realizacji transakcji między wieloma podmiotami. Reliable Actors zapewnia pełną gwarancję wiarygodności danych w granicach podmiotu. Ze względu na rozproszoną i luźno powiązaną naturę modelu Aktora, realizacja transakcji angażujących wiele podmiotów nie jest banalnym zadaniem. Jeśli transakcje "rozproszone" są silnym wymogiem, model programowania Reliable Services jest prawdopodobnie lepszym rozwiązaniem.

+2

Dziękuję za odpowiedź, która ma sens podchodzić do tego na tym poziomie - przynajmniej w takich sytuacjach, w których zestawy danych, nad którymi pracujesz, mogą wyjść poza kontrolę. Jakikolwiek przykładowy kod, który masz gotowy w przygotowaniu, byłby bardzo doceniony, dokładnie sprawdzamy serwis Service Fabric w odniesieniu do naszej obecnej sytuacji użycia, aby dowiedzieć się, jak i czy powinniśmy go używać - więc byłoby ciekawiej zobaczyć więcej przykładów tam. –

+0

quote @clca > "(uwaga: dokumentacja jest nadal bardzo minimalna w interfejsie StateProvider, ale możemy opublikować przykładowy kod, jeśli jest to coś, co chcesz realizować)". Jesteśmy również bardzo zainteresowani kawałkiem kodu, który można udostępnić, byłoby świetnie czerpać inspirację. Z góry dzięki – MonDeveloper

3

wiem, że to zostało odebrane, ale niedawno znalazłam się w tym samym położeniu z systemu CQRS/ES a oto jak poszedłem o tym

  1. każdego agregatu został aktorem tylko aktualnego stanu przechowywane w tym.
  2. W poleceniu agregat spowodowałby zmianę stanu i podniesienie zdarzenia.
  3. Same zdarzenia są zapisywane w DocDb.
  4. Po aktywacji instancje AggregateActor odczytują zdarzenia z DocDb, jeśli są dostępne, aby odtworzyć stan. Jest to oczywiście tylko raz na aktywację aktora. Dbało to o przypadek, w którym instancja aktora jest migrowana z jednego węzła do drugiego.
0

Aby odpowiedzieć na pytanie @ sedcondary Trond, który brzmi: „Co robi «jeśli nie wdrożyć opcjonalny wytrwałości»wskazują tutaj?”

Aktor jest zawsze Stateful serwis, a jego stan może być skonfigurowany przy użyciu atrybutu na klasy aktora, aby działać w jednym z trzech trybów:

  1. trwało. Stan jest replikowany na wszystkie instancje repliki, a także również zapisywany na dysku. Ten stan jest utrzymywany, nawet jeśli wszystkie repliki są wyłączone.
  2. Niestabilna. Stan jest replikowany do wszystkich instancji repliki , tylko w pamięci. Oznacza to, że dopóki jedna instancja repliki żyje, stan jest utrzymywany. Ale gdy wszystkie repliki są wyłączone, stan zostaje utracony i nie można go odzyskać po ponownym uruchomieniu .
  3. Brak uporczywości. Stan nie jest replikowany do innych instancji repliki ani do dysku. Zapewnia to ochronę najmniejszego stanu .

Pełne omówienie tego tematu można znaleźć in the Microsoft documentation

Powiązane problemy