Gestione dello stato di Reliable ActorsReliable Actors state management

I Reliable Actors sono oggetti a thread singolo che possono incapsulare sia la logica che lo stato.Reliable Actors are single-threaded objects that can encapsulate both logic and state. Poiché gli attori vengono eseguiti nei servizi Reliable Services, possono mantenere lo stato in modo affidabile con gli stessi meccanismi di persistenza e replica.Because actors run on Reliable Services, they can maintain state reliably by using the same persistence and replication mechanisms. In questo modo, gli attori non perdono il proprio stato dopo gli errori, dopo la riattivazione in seguito a un'operazione di garbage collection o quando vengono spostati tra i nodi di un cluster a causa del bilanciamento delle risorse o degli aggiornamenti.This way, actors don't lose their state after failures, upon reactivation after garbage collection, or when they are moved around between nodes in a cluster due to resource balancing or upgrades.

Replica e persistenza dello statoState persistence and replication

Tutti i Reliable Actors vengono considerati con stato perché ogni istanza dell'attore è mappata a un ID univoco.All Reliable Actors are considered stateful because each actor instance maps to a unique ID. Ciò significa che le chiamate ripetute allo stesso ID attore vengono instradate alla stessa istanza dell'attore.This means that repeated calls to the same actor ID are routed to the same actor instance. In un sistema senza stato invece le chiamate client non vengono instradate ogni volta necessariamente allo stesso server.In a stateless system, by contrast, client calls are not guaranteed to be routed to the same server every time. Per questo motivo, i servizi Actor sono sempre servizi con stato.For this reason, actor services are always stateful services.

Anche se gli attori sono considerati con stato, non significa che devono archiviare lo stato in modo affidabile.Even though actors are considered stateful, that does not mean they must store state reliably. Gli attori possono scegliere il livello di replica e persistenza dello stato in base ai requisiti di archiviazione dei dati:Actors can choose the level of state persistence and replication based on their data storage requirements:

  • Stato persistente: lo stato viene salvato nel disco e replicato in almeno tre repliche.Persisted state: State is persisted to disk and is replicated to three or more replicas. Questa è l'opzione di archiviazione dello stato più durevole, in cui lo stato può persistere anche in caso di interruzione di un cluster completo.Persisted state is the most durable state storage option, where state can persist through complete cluster outage.
  • Stato volatile: lo stato viene replicato in almeno tre repliche e viene mantenuto solo in memoria.Volatile state: State is replicated to three or more replicas and only kept in memory. Fornisce la resilienza in caso di errore del nodo, di errore dell'attore e durante gli aggiornamenti e il bilanciamento delle risorse.Volatile state provides resilience against node failure and actor failure, and during upgrades and resource balancing. Lo stato tuttavia non è persistente nel disco.However, state is not persisted to disk. Perciò, se vengono perse contemporaneamente tutte le repliche, si perderà anche lo stato.So if all replicas are lost at once, the state is lost as well.
  • Stato non persistente: lo stato non viene replicato o scritto su disco. Usare solo per gli attori che non devono mantenere lo stato in modo affidabile.No persisted state: State is not replicated or written to disk, only use for actors that don't need to maintain state reliably.

Ogni livello di persistenza è semplicemente un altro provider di stato e un'altra configurazione di replica del servizio.Each level of persistence is simply a different state provider and replication configuration of your service. La scrittura su disco dello stato dipende dal provider di stato, ovvero il componente di un servizio Reliable Services che archivia lo stato.Whether or not state is written to disk depends on the state provider--the component in a reliable service that stores state. La replica dipende dal numero di repliche con cui viene distribuito un servizio.Replication depends on how many replicas a service is deployed with. In modo analogo ai servizi Reliable Services, il provider di stato e il numero di repliche possono essere impostati manualmente con facilità.As with Reliable Services, both the state provider and replica count can easily be set manually. Il framework per gli attori fornisce un attributo che, quando viene usato in un attore, seleziona automaticamente un provider di stato predefinito e genera automaticamente le impostazioni per il numero di repliche in modo da ottenere una di queste tre impostazioni di persistenza.The actor framework provides an attribute that, when used on an actor, automatically selects a default state provider and automatically generates settings for replica count to achieve one of these three persistence settings. L'attributo StatePersistence non viene ereditato dalla classe derivata e ogni tipo di attore deve specificare il proprio livello StatePersistence.The StatePersistence attribute is not inherited by derived class, each Actor type must provide its StatePersistence level.

Stato persistentePersisted state

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

Questa impostazione usa un provider di stato che archivia i dati su disco e imposta automaticamente il numero di repliche del servizio su 3.This setting uses a state provider that stores data on disk and automatically sets the service replica count to 3.

Stato volatileVolatile state

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

Questa impostazione usa un provider di stato solo in memoria e imposta il numero di repliche su 3.This setting uses an in-memory-only state provider and sets the replica count to 3.

Stato non persistenteNo persisted state

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

Questa impostazione usa un provider di stato solo in memoria e imposta il numero di repliche su 1.This setting uses an in-memory-only state provider and sets the replica count to 1.

Impostazioni predefinite e impostazioni generateDefaults and generated settings

Quando si usa l'attributo StatePersistence, viene selezionato automaticamente un provider di stato in fase di esecuzione all'avvio del servizio attore.When you're using the StatePersistence attribute, a state provider is automatically selected for you at runtime when the actor service starts. Il numero di repliche, tuttavia, viene impostato in fase di compilazione dagli strumenti di compilazione dell'attore di Visual Studio.The replica count, however, is set at compile time by the Visual Studio actor build tools. Gli strumenti di compilazione generano automaticamente un servizio predefinito per il servizio attore in ApplicationManifest.xml.The build tools automatically generate a default service for the actor service in ApplicationManifest.xml. I parametri vengono creati per le dimensioni minime del set di repliche e le dimensioni del set di repliche di destinazione.Parameters are created for min replica set size and target replica set size.

È possibile cambiare questi parametri manualmente.You can change these parameters manually. Tuttavia, ogni volta che l'attributo StatePersistence viene modificato, i parametri vengono impostati sui valori predefiniti delle dimensioni del set di repliche per l'attributo StatePersistence selezionato, eseguendo l'override di eventuali valori precedenti.But each time the StatePersistence attribute is changed, the parameters are set to the default replica set size values for the selected StatePersistence attribute, overriding any previous values. In altri termini, l'override dei valori impostati in ServiceManifest.xml viene eseguito solo in fase di compilazione quando si modifica l'attributo StatePersistence.In other words, the values that you set in ServiceManifest.xml are only overridden at build time when you change the StatePersistence attribute value.

<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://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>

State ManagerState manager

Ogni istanza dell'attore ha un proprio gestore di stato: una struttura di dati simile a un dizionario che archivia in modo affidabile le coppie chiave-valore.Every actor instance has its own state manager: a dictionary-like data structure that reliably stores key/value pairs. Il gestore di stato è un wrapper per il provider di stato.The state manager is a wrapper around a state provider. Può essere usato per archiviare i dati indipendentemente dall'impostazione di persistenza utilizzata.You can use it to store data regardless of which persistence setting is used. Non garantisce assolutamente che un servizio attore in esecuzione possa essere modificato da un'impostazione di stato volatile (solo in memoria) in un'impostazione di stato persistente tramite un aggiornamento in sequenza mantenendo al tempo stesso i dati.It does not provide any guarantees that a running actor service can be changed from a volatile (in-memory-only) state setting to a persisted state setting through a rolling upgrade while preserving data. Tuttavia, è possibile modificare il numero di repliche per un servizio in esecuzione.However, it is possible to change replica count for a running service.

Le chiavi di gestione dello stato devono essere stringhe.State manager keys must be strings. I valori sono di tipo generico e possono essere di qualsiasi tipo, inclusi i tipi personalizzati.Values are generic and can be any type, including custom types. I valori archiviati nel gestore di stato devono essere serializzabili in base al contratto dati perché possono essere trasmessi in rete ad altri nodi durante la replica e possono essere scritti su disco, a seconda dell'impostazione di persistenza dello stato di un attore.Values stored in the state manager must be data contract serializable because they might be transmitted over the network to other nodes during replication and might be written to disk, depending on an actor's state persistence setting.

Il gestore di stato espone i metodi di dizionario comuni per la gestione dello stato, simili a quelli disponibili in Reliable Dictionary.The state manager exposes common dictionary methods for managing state, similar to those found in Reliable Dictionary.

Per esempi di gestione dello stato degli attori, vedere Accedere, salvare e rimuovere lo stato di Reliable Actors.For examples of managing actor state, read Access, save, and remove Reliable Actors state.

Procedure consigliateBest practices

Di seguito vengono proposti alcuni suggerimenti per la risoluzione dei problemi e procedure consigliate per la gestione dello stato dell'attore.Here are some suggested practices and troubleshooting tips for managing your actor state.

Rendere lo stato dell'attore il più granulare possibileMake the actor state as granular as possible

Questo è un aspetto cruciale per le prestazioni e l'utilizzo delle risorse dell'applicazione.This is critical for performance and resource usage of your application. Per ogni scrittura/aggiornamento dello "stato denominato" di un attore, l'intero valore corrispondente a tale "stato denominato" viene serializzato e inviato alle repliche secondarie tramite la rete.Whenever there is any write/update to the "named state" of an actor, the whole value corresponding to that "named state" is serialized and sent over the network to the secondary replicas. Le repliche secondarie lo scrivono nel disco locale e rispondono alla replica primaria.The secondaries write it to local disk and reply back to the primary replica. Quando la replica primaria riceve i riconoscimenti da un quorum di repliche secondarie, scrive lo stato nel disco locale.When the primary receives acknowledgements from a quorum of secondary replicas, it writes the state to its local disk. Si supponga, ad esempio, che il valore sia una classe con 20 membri e dimensioni pari a 1 MB.For example, suppose the value is a class which has 20 members and a size of 1 MB. Anche se si modifica solo uno dei membri della classe con dimensioni di 1 KB, occorre sostenere i costi della serializzazione e delle scritture in rete e su disco per l'intero MB.Even if you only modified one of the class members which is of size 1 KB, you end up paying the cost of serialization and network and disk writes for the full 1 MB. Analogamente, se il valore è una raccolta (ad esempio un elenco, una matrice o un dizionario), si paga il costo per l'intera raccolta anche se si modifica uno solo dei membri.Similarly, if the value is a collection (such as a list, array, or dictionary), you pay the cost for the complete collection even if you modify one of it's members. L'interfaccia di StateManager della classe dell'attore è simile a un dizionario.The StateManager interface of the actor class is like a dictionary. È sempre necessario modellare la struttura dei dati che rappresenta lo stato dell'attore sulla base di questo dizionario.You should always model the data structure representing actor state on top of this dictionary.

Gestire correttamente il ciclo di vita dell'attoreCorrectly manage the actor's life-cycle

È necessario definire criteri chiari per la gestione delle dimensioni dello stato in ogni partizione di un servizio Actor.You should have clear policy about managing the size of state in each partition of an actor service. Il servizio Actor deve avere un numero fisso di attori e riutilizzarli il più possibile.Your actor service should have a fixed number of actors and reuse them a much as possible. Se si creano continuamente nuovi attori, è necessario eliminarli quando hanno terminato le operazioni.If you continuously create new actors, you must delete them once they are done with their work. Il framework del servizio Actor archivia alcuni metadati per ogni attore esistente.The actor framework stores some metadata about each actor that exists. L'eliminazione di tutto lo stato di un attore non comporta la rimozione dei relativi metadati.Deleting all the state of an actor does not remove metadata about that actor. È necessario eliminare l'attore (vedere Eliminazione di attori e del relativo stato) per rimuovere tutte le informazioni su tale attore archiviate nel sistema.You must delete the actor (see deleting actors and their state) to remove all the information about it stored in the system. A titolo di controllo aggiuntivo, è necessario eseguire query sul servizio Actor (vedere Enumerazione degli attori) regolarmente per assicurarsi che il numero di attori sia compreso nell'intervallo previsto.As an extra check, you should query the actor service (see enumerating actors) once in a while to make sure the number actors are within the expected range.

Se si riscontra un aumento delle dimensioni del file di database di un servizio Actor oltre il limite previsto, assicurarsi di seguire le linee guida precedenti.If you ever see that database file size of an Actor Service is increasing beyond the expected size, make sure that you are following the preceding guidelines. Se si seguono queste linee guida ed esistono comunque problemi di dimensioni del file di database, è necessario aprire un ticket di supporto per richiedere assistenza al team del prodotto.If you are following these guidelines and are still database file size issues, you should open a support ticket with the product team to get help.

Passaggi successiviNext steps

Lo stato archiviato in Reliable Actors deve essere serializzato prima di essere scritto sul disco e replicato per la disponibilità elevata.State that's stored in Reliable Actors must be serialized before its written to disk and replicated for high availability. Altre informazioni sulla serializzazione del tipo di attore.Learn more about Actor type serialization.

Vedere anche Diagnostica e monitoraggio delle prestazioni per Reliable Actors.Next, learn more about Actor diagnostics and performance monitoring.