Jak objekty Reliable Actors využívají platformu Service Fabric
Tento článek vysvětluje, jak Reliable Actors fungují na platformě Azure Service Fabric. Reliable Actors běží v rámci hostované v implementaci stavové spolehlivé služby označované jako služba actor. Služba actor obsahuje všechny komponenty potřebné ke správě životního cyklu a odesílání zpráv pro vaše aktéry:
- Modul runtime objektu Actor spravuje životní cyklus, uvolňování paměti a vynucuje přístup s jedním vláknem.
- Naslouchací proces služby objektu actor přijímá volání vzdáleného přístupu k objektům actor a odesílá je dispečerovi, který bude směrovat do příslušné instance objektu actor.
- Zprostředkovatel stavu objektu actor zabalí zprostředkovatele stavu (například poskytovatele stavu Reliable Collections) a poskytuje adaptér pro správu stavu objektu actor.
Tyto komponenty společně tvoří architekturu Reliable Actor.
Vrstvení služeb
Vzhledem k tomu, že samotná služba actor je spolehlivá služba, všechny aplikační modely, životní cyklus, balení, nasazení, upgrade a škálování Reliable Services používají stejný způsob jako služby actor.
Předchozí diagram znázorňuje vztah mezi aplikačními architekturami Service Fabric a uživatelským kódem. Modré prvky představují aplikační architekturu Reliable Services, oranžová představuje architekturu Reliable Actor a zelený představuje uživatelský kód.
V Reliable Services vaše služba dědí StatefulService
třídu. Tato třída je odvozena od StatefulServiceBase
(nebo StatelessService
pro bezstavové služby). V Reliable Actors použijete službu actor. Služba actor je jiná implementace StatefulServiceBase
třídy, která implementuje vzor objektu actor, ve kterém jsou spuštěni vaši aktéři. Protože samotná služba actor je pouze implementace StatefulServiceBase
, můžete napsat vlastní službu, která je odvozena od ActorService
a implementovat funkce na úrovni služby stejným způsobem jako při dědění StatefulService
, například:
- Zálohování a obnovení služby.
- Sdílené funkce pro všechny aktéry, například jistič.
- Vzdálená procedura volá samotnou službu objektu actor a každého jednotlivého aktéra.
Další informace najdete v tématu Implementace funkcí na úrovni služeb ve službě actor.
Aplikační model
Služby actor jsou Reliable Services, takže aplikační model je stejný. Nástroje pro sestavení architektury objektu actor však za vás generují některé soubory modelu aplikace.
Manifest služby
Nástroje pro sestavení architektury actor automaticky generují obsah souboru ServiceManifest.xml služby actor. Tento soubor zahrnuje:
- Typ služby objektu actor. Název typu se vygeneruje na základě názvu projektu objektu actor. Na základě atributu trvalosti objektu actor je příznak HasPersistedState také nastaven odpovídajícím způsobem.
- Balíček kódu.
- Konfigurační balíček.
- Prostředky a koncové body
Manifest aplikace
Nástroje pro sestavení architektury actor automaticky vytvoří výchozí definici služby pro vaši službu actor. Nástroje sestavení naplní výchozí vlastnosti služby:
- Počet sady replik je určen atributem trvalosti vašeho objektu actor. Pokaždé, když se změní atribut trvalosti objektu actor, se odpovídajícím způsobem resetuje počet sady replik ve výchozí definici služby.
- Schéma oddílů a rozsah jsou nastaveny na Uniform Int64 s úplným rozsahem klíčů Int64.
Koncepty oddílů Service Fabric pro aktéry
Služby actor jsou dělené stavové služby. Každý oddíl služby actor obsahuje sadu objektů actor. Oddíly služby se v Service Fabric automaticky distribuují do více uzlů. Instance objektu actor se distribuují jako výsledek.
Reliable Services je možné vytvářet s různými schématy oddílů a rozsahy klíčů oddílů. Služba actor používá schéma dělení Int64 s úplným rozsahem klíčů Int64 k mapování objektů actor na oddíly.
Actor ID
Každý objekt actor vytvořený ve službě má přidružené jedinečné ID reprezentované ActorId
třídou. ActorId
je neprůhlená hodnota ID, kterou lze použít pro jednotné rozdělení objektů actor mezi oddíly služby generováním náhodných ID:
ActorProxy.Create<IMyActor>(ActorId.CreateRandom());
ActorProxyBase.create<MyActor>(MyActor.class, ActorId.newId());
Každá ActorId
hodnota je hashována na int64. Proto služba actor musí používat schéma dělení Int64 s úplným rozsahem klíčů Int64. Vlastní hodnoty ID se ale dají použít pro identifikátory ActorID
GUID/UUID, řetězce a int64.
ActorProxy.Create<IMyActor>(new ActorId(Guid.NewGuid()));
ActorProxy.Create<IMyActor>(new ActorId("myActorId"));
ActorProxy.Create<IMyActor>(new ActorId(1234));
ActorProxyBase.create(MyActor.class, new ActorId(UUID.randomUUID()));
ActorProxyBase.create(MyActor.class, new ActorId("myActorId"));
ActorProxyBase.create(MyActor.class, new ActorId(1234));
Při použití identifikátorů GUID/UUID a řetězců se hodnoty hashují na int64. Pokud ale explicitně zadáte int64 objektu ActorId
, int64 se mapuje přímo na oddíl bez dalšího hashování. Pomocí této techniky můžete určit, ve kterém oddílu jsou aktéři umístěni.