Sdílet prostřednictvím


Správa stavu Reliable Actors

Reliable Actors jsou objekty s jedním vláknem, které mohou zapouzdřovat logiku i stav. Vzhledem k tomu, že aktéři běží na Reliable Services, mohou spolehlivě udržovat stav pomocí stejných mechanismů trvalosti a replikace. Díky tomu herci neztratí svůj stav po selhání, po opětovné aktivaci po uvolnění paměti nebo když se přesunou mezi uzly v clusteru kvůli vyrovnávání prostředků nebo upgradům prostředků.

Trvalost stavu a replikace

Všechny Reliable Actors jsou považovány za stavové , protože každá instance objektu actor se mapuje na jedinečné ID. To znamená, že opakované volání stejného ID objektu actor se směrují do stejné instance objektu actor. V bezstavovém systému naopak není zaručeno, že se klientská volání budou pokaždé směrovat na stejný server. Z tohoto důvodu jsou služby actor vždy stavové služby.

I když jsou aktéři považováni za stavové, neznamená to, že musí spolehlivě ukládat stav. Aktéři můžou zvolit úroveň trvalosti stavu a replikace na základě požadavků na úložiště dat:

  • Trvalý stav: Stav je trvalý na disku a replikuje se do tří nebo více replik. Trvalý stav je nejúdržnější možností úložiště stavu, kdy se stav může uchovávat po úplném výpadku clusteru.
  • Nestálý stav: Stav se replikuje na tři nebo více replik a uchovává se pouze v paměti. Nestálý stav zajišťuje odolnost proti selhání uzlu a selhání objektu actor a během upgradů a vyrovnávání prostředků. Stav se však neuchovává na disk. Takže pokud dojde ke ztrátě všech replik najednou, stav se ztratí i.
  • Žádný trvalý stav: Stav se nereplikuje nebo zapisuje na disk, používá se pouze pro aktéry, kteří nepotřebují spolehlivě udržovat stav.

Každá úroveň trvalosti je jednoduše jiným poskytovatelem stavu a konfigurací replikace vaší služby. Určuje, jestli je stav zapsán na disk, závisí na poskytovateli stavu – komponentě ve spolehlivé službě, která ukládá stav. Replikace závisí na tom, s kolika replikami se služba nasadí. Stejně jako u Reliable Services je možné nastavit ručně jak poskytovatele stavu, tak počet replik. Architektura objektu actor poskytuje atribut, který při použití na objektu actor automaticky vybere výchozího zprostředkovatele stavu a automaticky vygeneruje nastavení počtu replik, aby bylo dosaženo jednoho z těchto tří nastavení trvalosti. StatePersistence atribut není zděděna odvozenou třídou, každý typ actor musí poskytovat svou úroveň StatePersistence.

Trvalý stav

[StatePersistence(StatePersistence.Persisted)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
class MyActorImpl  extends FabricActor implements MyActor
{
}

Toto nastavení používá zprostředkovatele stavu, který ukládá data na disk a automaticky nastaví počet replik služby na 3.

Nestálý stav

[StatePersistence(StatePersistence.Volatile)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.Volatile)
class MyActorImpl extends FabricActor implements MyActor
{
}

Toto nastavení používá zprostředkovatele stavu jen v paměti a nastaví počet replik na 3.

Bez trvalého stavu

[StatePersistence(StatePersistence.None)]
class MyActor : Actor, IMyActor
{
}
@StatePersistenceAttribute(statePersistence = StatePersistence.None)
class MyActorImpl extends FabricActor implements MyActor
{
}

Toto nastavení používá zprostředkovatele stavu pouze v paměti a nastaví počet replik na 1.

Výchozí hodnoty a vygenerovaná nastavení

Při použití atributu StatePersistence se při spuštění služby actor automaticky vybere poskytovatel stavu za běhu. Počet replik je však nastaven v době kompilace nástroji sestavení objektu actor sady Visual Studio. Nástroje sestavení automaticky generují výchozí službu pro službu actor v ApplicationManifest.xml. Parametry se vytvoří pro minimální velikost sady replik a velikost sady cílových replik.

Tyto parametry můžete změnit ručně. Při každé změně atributu StatePersistence se ale parametry nastaví na výchozí hodnoty velikosti sady replik pro vybraný StatePersistence atribut a přepíše všechny předchozí hodnoty. Jinými slovy, hodnoty, které jste nastavili v ServiceManifest.xml, jsou přepsány pouze v době sestavení při změně hodnoty atributu StatePersistence .

<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application12Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
   <Parameters>
      <Parameter Name="MyActorService_PartitionCount" DefaultValue="10" />
      <Parameter Name="MyActorService_MinReplicaSetSize" DefaultValue="3" />
      <Parameter Name="MyActorService_TargetReplicaSetSize" DefaultValue="3" />
   </Parameters>
   <ServiceManifestImport>
      <ServiceManifestRef ServiceManifestName="MyActorPkg" ServiceManifestVersion="1.0.0" />
   </ServiceManifestImport>
   <DefaultServices>
      <Service Name="MyActorService" GeneratedIdRef="77d965dc-85fb-488c-bd06-c6c1fe29d593|Persisted">
         <StatefulService ServiceTypeName="MyActorServiceType" TargetReplicaSetSize="[MyActorService_TargetReplicaSetSize]" MinReplicaSetSize="[MyActorService_MinReplicaSetSize]">
            <UniformInt64Partition PartitionCount="[MyActorService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatefulService>
      </Service>
   </DefaultServices>
</ApplicationManifest>

Správce stavů

Každá instance objektu actor má vlastní správce stavu: datovou strukturu podobná slovníku, která spolehlivě ukládá páry klíč/hodnota. Správce stavů je obálka kolem poskytovatele stavu. Můžete ho použít k ukládání dat bez ohledu na to, které nastavení trvalosti se používá. Neposkytuje žádné záruky, že spuštěná služba actor může být změněna z nestálého (pouze v paměti) nastavení stavu na trvalé nastavení stavu prostřednictvím postupného upgradu při zachování dat. U spuštěné služby je ale možné změnit počet replik.

Klíče správce stavu musí být řetězce. Hodnoty jsou obecné a mohou být libovolným typem, včetně vlastních typů. Hodnoty uložené ve správci stavů musí být serializovatelné, protože se můžou přenášet přes síť do jiných uzlů během replikace a můžou být zapsány na disk v závislosti na nastavení trvalosti stavu objektu actor.

Správce stavů zveřejňuje běžné metody slovníku pro správu stavu, podobně jako ty, které jsou nalezeny ve Reliable Dictionary.

Příklady správy stavu objektu actor, čtení Accessu, uložení a odebrání stavu Reliable Actors.

Osvědčené postupy

Tady jsou některé doporučené postupy a tipy pro řešení potíží pro správu stavu objektu actor.

Co nejpodrobnější stav objektu actor

To je důležité pro výkon a využití prostředků vaší aplikace. Při každém zápisu nebo aktualizaci na "pojmenovaný stav" objektu actor se celá hodnota odpovídající této pojmenované stavu serializuje a odesílá přes síť do sekundárních replik. Druhý soubor zapisuje na místní disk a odpovídá zpět na primární repliku. Když primární obdrží potvrzení z kvora sekundárních replik, zapíše stav na místní disk. Předpokládejme například, že hodnota je třída, která má 20 členů a velikost 1 MB. I když jste změnili pouze jeden ze členů třídy, který je velikost 1 kB, nakonec platíte náklady na serializaci a síťové a diskové zápisy za celých 1 MB. Podobně platíte, že pokud je hodnota kolekce (například seznam, pole nebo slovník), platíte náklady na celou kolekci i v případě, že upravíte některý z jeho členů. Rozhraní StateManager třídy objektu actor je jako slovník. Vždy byste měli modelovat datovou strukturu představující stav objektu actor nad tímto slovníkem.

Správně spravovat životní cyklus herce

Měli byste mít jasné zásady týkající se správy velikosti stavu v jednotlivých oddílech služby actor. Vaše služba actor by měla mít pevný počet herců a co nejvíce je znovu použít. Pokud průběžně vytváříte nové aktéry, musíte je po dokončení práce odstranit. Architektura objektu actor ukládá určitá metadata o každém objektu actor, který existuje. Odstranění veškerého stavu objektu actor neodebere metadata o daném objektu actor. Pokud chcete odebrat všechny informace o objektu actor uloženém v systému, musíte objekt actor (viz odstranění objektů actor a jejich stav). Jako další kontrolu byste měli dotazovat službu objektu actor (viz výčet herců) jednou za chvíli, abyste měli jistotu, že počet herců je v očekávaném rozsahu.

Pokud se někdy zobrazí, že velikost souboru databáze služby Actor se zvětšuje nad očekávanou velikost, ujistěte se, že jste postupli podle předchozích pokynů. Pokud budete postupovat podle těchto pokynů a stále dochází k problémům s velikostí souborů databáze, měli byste otevřít lístek podpory s produktovým týmem a získat pomoc.

Další kroky

Stav, který je uložený v Reliable Actors, musí být serializován před zápisem na disk a replikován pro zajištění vysoké dostupnosti. Přečtěte si další informace o serializaci typů objektu Actor.

Dále se dozvíte více o diagnostice objektu Actor a monitorování výkonu.