Linee guida e consigli per Reliable Collections in Azure Service FabricGuidelines and recommendations for Reliable Collections in Azure Service Fabric

Questa sezione fornisce le linee guida per l'uso di Reliable State Manager e Reliable Collections.This section provides guidelines for using Reliable State Manager and Reliable Collections. L'obiettivo è quello di aiutare gli utenti a evitare errori comuni.The goal is to help users avoid common pitfalls.

Le linee guida sono organizzate come semplici consiglisu cosa fare , prendere in considerazione , evitare enon fare.The guidelines are organized as simple recommendations prefixed with the terms Do, Consider, Avoid and Do not.

  • Non modificare un oggetto di tipo personalizzato restituito dalle operazioni di lettura, ad esempio TryPeekAsync o TryGetValueAsync.Do not modify an object of custom type returned by read operations (for example, TryPeekAsync or TryGetValueAsync). Le raccolte Reliable Collections, così come le raccolte Concurrent Collections, restituiscono un riferimento agli oggetti, non una copia.Reliable Collections, just like Concurrent Collections, return a reference to the objects and not a copy.
  • Eseguire una copia completa dell'oggetto di tipo personalizzato restituito prima di modificarlo.Do deep copy the returned object of a custom type before modifying it. Poiché le strutture e i tipi predefiniti vengono passati per valore, non è necessario eseguirne una copia completa.Since structs and built-in types are pass-by-value, you do not need to do a deep copy on them.
  • Non usare TimeSpan.MaxValue per i timeout.Do not use TimeSpan.MaxValue for time-outs. I timeout devono essere usati per rilevare i deadlock.Time-outs should be used to detect deadlocks.
  • Non usare una transazione dopo che ne è stato eseguito il commit, è stata interrotta o eliminata.Do not use a transaction after it has been committed, aborted, or disposed.
  • Non usare un'enumerazione all'esterno dell'ambito di transazione nella quale è stata creata.Do not use an enumeration outside of the transaction scope it was created in.
  • Non creare una transazione all'interno dell'istruzione using di un'altra transazione. Questa operazione può causare deadlock.Do not create a transaction within another transaction’s using statement because it can cause deadlocks.
  • Verificare che l'implementazione di IComparable<TKey> sia corretta.Do ensure that your IComparable<TKey> implementation is correct. Il sistema presenta dipendenze su IComparable<TKey> per l'unione di checkpoint e righe.The system takes dependency on IComparable<TKey> for merging checkpoints and rows.
  • Usare il blocco di aggiornamento durante la lettura di un elemento con l'intenzione di aggiornarlo in modo da evitare una determinata classe di deadlock.Do use Update lock when reading an item with an intention to update it to prevent a certain class of deadlocks.
  • Prendere in considerazione l'opportunità di mantenere gli elementi (ad esempio TKey + TValue per Reliable Dictionary) sotto gli 80 Kbyte: più sono piccoli, meglio è.Consider keeping your items (for example, TKey + TValue for Reliable Dictionary) below 80 KBytes: smaller the better. In questo modo, è possibile ridurre l'uso di heap di oggetti di grandi dimensioni, oltre che i requisiti di dischi e I/O di rete.This reduces the amount of Large Object Heap usage as well as disk and network IO requirements. Spesso si riduce anche la replica dei dati duplicati quando viene aggiornata solo una piccola parte del valore.Often, it reduces replicating duplicate data when only one small part of the value is being updated. Un modo comune per ottenere questo in Reliable Dictionary è interrompere le righe in più righe.Common way to achieve this in Reliable Dictionary, is to break your rows in to multiple rows.
  • Prendere in considerazione l'uso della funzionalità di backup e ripristino per il ripristino di emergenza.Consider using backup and restore functionality to have disaster recovery.
  • Evitare di combinare nella stessa transazione le operazioni a singola entità e a più entità, ad esempio GetCountAsync, CreateEnumerableAsync, a causa dei diversi livelli di isolamento.Avoid mixing single entity operations and multi-entity operations (e.g GetCountAsync, CreateEnumerableAsync) in the same transaction due to the different isolation levels.
  • Gestire InvalidOperationException.Do handle InvalidOperationException. Le transazioni utente possono essere interrotte dal sistema per diversi motivi.User transactions can be aborted by the system for variety of reasons. Ad esempio, quando cambia il Gestore dello stato affidabile cambia il proprio ruolo da ruolo primario o quando una transazione a esecuzione prolungata blocca il troncamento del log delle transazioni.For example, when the Reliable State Manager is changing its role out of Primary or when a long-running transaction is blocking truncation of the transactional log. In questi casi, l'utente può ricevere un evento InvalidOperationException, che indica che la transazione è già stata terminata.In such cases, user may receive InvalidOperationException indicating that their transaction has already been terminated. Supponendo che l'interruzione della transazione non è stata richiesta dall'utente, il modo migliore per gestire questa eccezione è di eliminare la transazione, verificare se il token di annullamento è stato segnalato (o se il ruolo della replica è stato modificato) e in caso contrario creare una nuova transazione e riprovare.Assuming, the termination of the transaction was not requested by the user, best way to handle this exception is to dispose the transaction, check if the cancellation token has been signaled (or the role of the replica has been changed), and if not create a new transaction and retry.

Occorre tenere presente i concetti seguenti:Here are some things to keep in mind:

  • Il timeout predefinito di tutte le API Reliable Collections è di quattro secondi.The default time-out is four seconds for all the Reliable Collection APIs. La maggior parte degli utenti deve usare il timeout predefinito.Most users should use the default time-out.
  • Il token di annullamento predefinito è CancellationToken.None in tutte le API di Reliable Collections.The default cancellation token is CancellationToken.None in all Reliable Collections APIs.
  • Il parametro di tipo di chiave (TKey) per un oggetto ReliableDictionary deve implementare correttamente GetHashCode() e Equals().The key type parameter (TKey) for a Reliable Dictionary must correctly implement GetHashCode() and Equals(). Le chiavi non devono essere modificabili.Keys must be immutable.
  • Per ottenere una disponibilità elevata per le raccolte Reliable Collections, ogni servizio deve avere almeno un set di repliche di destinazione costituito da un minimo di 3 repliche.To achieve high availability for the Reliable Collections, each service should have at least a target and minimum replica set size of 3.
  • Le operazioni di lettura sul secondario possono leggere le versioni che non sono vincolate a un quorum.Read operations on the secondary may read versions that are not quorum committed. Ciò significa che una versione dei dati che viene letta da un singolo secondario potrebbe essere elaborata in modo non corretto.This means that a version of data that is read from a single secondary might be false progressed. Le letture della replica primaria sono sempre stabili: non sono mai elaborate in modo non corretto.Reads from Primary are always stable: can never be false progressed.

Passaggi successiviNext steps