Sdílet prostřednictvím


Správa stavu Reliable Actors

Reliable Actors jsou objekty s jedním vláknem, které mohou zapouzdřit logiku i stav. Vzhledem k tomu, že aktéři běží ve službě Reliable Services, můžou spolehlivě udržovat stav pomocí stejných mechanismů trvalosti a replikace. Díky tomu herci neztratí svůj stav po selháních, při opětovné aktivaci po uvolnění paměti nebo při přesunu mezi uzly v clusteru kvůli vyrovnávání 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 jsou směrována do stejné instance objektu actor. V bezstavovém systému naopak není zaručeno, že se volání klientů 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í stav spolehlivě ukládat. Aktéři můžou zvolit úroveň trvalosti stavu a replikace na základě svých 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 nejodolnější možností úložiště stavu, kde se stav může zachovat i po úplném výpadku clusteru.
  • Nestálý stav: Stav se replikuje do tří nebo více replik a uchovává se pouze v paměti. Nestálý stav poskytuje odolnost proti selhání uzlu a selhání objektu actor a během upgradů a vyrovnávání prostředků. Stav však není trvale uložen na disku. Takže pokud dojde ke ztrátě všech replik najednou, ztratí se i stav.
  • Žádný trvalý stav: Stav se nereplikuje ani nezapisuje 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. To, jestli je stav zapsán na disk, závisí na poskytovateli stavu – na komponentě ve spolehlivé službě, která ukládá stav. Replikace závisí na tom, s kolika replikami je služba nasazená. Stejně jako u Reliable Services je možné snadno nastavit poskytovatele stavu i počet replik ručně. Architektura objektu actor poskytuje atribut, který při použití v objektu actor automaticky vybere výchozího zprostředkovatele stavu a automaticky vygeneruje nastavení pro počet replik, aby se dosáhlo jednoho z těchto tří nastavení trvalosti. Atribut StatePersistence 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á poskytovatele 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.

Žádný trvalý stav

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

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

Výchozí a vygenerovaná nastavení

Pokud používáte StatePersistence atribut, je za běhu při spuštění služby actor automaticky vybrán poskytovatel stavu. Počet replik je však nastaven v době kompilace nástroji sestavení objektu Actor sady Visual Studio. Nástroje sestavení automaticky vygenerují výchozí službu pro službu actor v ApplicationManifest.xml. Parametry se vytvářejí pro minimální velikost sady replik a velikost cílové sady 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 repliky pro vybraný StatePersistence atribut a přepíše všechny předchozí hodnoty. Jinými slovy, hodnoty, které nastavíte v ServiceManifest.xml, jsou přepsány pouze v době sestavení, když změníte hodnotu 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 stavu

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

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

Správce stavu zpřístupňuje běžné slovníkové metody pro správu stavu, podobné těm, které najdete ve spolehlivém slovníku.

Příklady správy stavu objektu actor najdete v článku Přístup, 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.

Nastavení co nejpodrobnějšího stavu objektu actor

To je důležité pro výkon a využití prostředků vaší aplikace. Kdykoli dojde k zápisu nebo aktualizaci "pojmenovaného stavu" objektu actor, je celá hodnota odpovídající danému "pojmenovanýmu stavu" serializována a odesílána přes síť sekundárním replikám. Sekundární ho zapíšou na místní disk a odpoví zpět na primární repliku. Když primární počítač 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 upravili pouze jeden z členů třídy, který má velikost 1 kB, nakonec zaplatíte náklady na serializaci a zápisy do sítě a disku za celý 1 MB. Podobně platí, že pokud je hodnotou kolekce (například seznam, pole nebo slovník), platíte náklady za celou kolekci i v případě, že upravíte některý z členů této kolekce. Rozhraní StateManager třídy 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á správa životního cyklu 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. Služba objektu actor by měla mít pevný počet herců a měla by je co nejvíce používat. Pokud neustále vytváříte nové aktéry, musíte je po dokončení práce odstranit. Architektura objektu actor ukládá některá metadata o každém objektu actor, který existuje. Odstraněním veškerého stavu objektu actor se neodeberou metadata o daném objektu. Pokud chcete odebrat všechny informace o něm uložené v systému, musíte objekt actor odstranit (viz odstranění herců a jejich stavu). Jako další kontrolu byste se měli jednou za čas dotazovat služby actor (viz výčet herců), abyste měli jistotu, že počet herců je v očekávaném rozsahu.

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

Další kroky

Stav 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. Další informace o serializaci typu objektu Actor.

Dále si přečtěte další informace o diagnostice objektu Actor a monitorování výkonu.