Modelli di messaggistica asincrona e disponibilità elevataAsynchronous messaging patterns and high availability

La messaggistica asincrona può essere implementata in molti modi diversi.Asynchronous messaging can be implemented in a variety of different ways. Con code, argomenti e sottoscrizioni, il bus di servizio di Azure supporta la messaggistica asincrona tramite un meccanismo di archiviazione e inoltro.With queues, topics, and subscriptions, Azure Service Bus supports asynchronism via a store and forward mechanism. In un'operazione normale (sincrona) i messaggi vengono inviati a code e argomenti e ricevuti da code e sottoscrizioni.In normal (synchronous) operation, you send messages to queues and topics, and receive messages from queues and subscriptions. Le applicazioni create dipendono dalla disponibilità continua di queste entità.Applications you write depend on these entities always being available. Quando l'integrità dell'entità cambia a causa di diverse circostanze, è necessario fornire un'entità a capacità limitata che possa soddisfare la maggior parte delle esigenze.When the entity health changes, due to a variety of circumstances, you need a way to provide a reduced capability entity that can satisfy most needs.

In genere, le applicazioni usano modelli di messaggistica asincrona per consentire diversi scenari di comunicazione.Applications typically use asynchronous messaging patterns to enable a number of communication scenarios. È possibile creare applicazioni in cui i client possono inviare messaggi ai servizi anche quando questi non sono in esecuzione.You can build applications in which clients can send messages to services, even when the service is not running. Per le applicazioni in cui si verificano picchi nelle comunicazioni, si può usare una coda per livellare il carico fornendo un'area per il buffer delle comunicazioni. For applications that experience bursts of communications, a queue can help level the load by providing a place to buffer communications. Infine è possibile ottenere un semplice ma efficace servizio di bilanciamento del carico per distribuire i messaggi tra più computer.Finally, you can get a simple but effective load balancer to distribute messages across multiple machines.

Per mantenere la disponibilità di una qualsiasi di queste entità, è necessario considerare i diversi casi in cui le entità possono risultare non disponibili per un sistema di messaggistica permanente.In order to maintain availability of any of these entities, consider a number of different ways in which these entities can appear unavailable for a durable messaging system. In generale, l'entità risulta non disponibile alle applicazioni nelle circostanze seguenti:Generally speaking, we see the entity become unavailable to applications we write in the following different ways:

  • Impossibilità di inviare messaggi.Unable to send messages.
  • Impossibilità di ricevere messaggi.Unable to receive messages.
  • Impossibilità di gestire le entità, ad esempio eseguire operazioni di creazione, recupero, aggiornamento o eliminazione.Unable to manage entities (create, retrieve, update, or delete entities).
  • Impossibilità di contattare il servizio.Unable to contact the service.

Per ognuno di questi problemi, esistono diverse modalità di errore che consentono a un'applicazione di continuare a funzionare a un certo livello di capacità limitata.For each of these failures, different failure modes exist that enable an application to continue to perform work at some level of reduced capability. Ad esempio, un sistema che può inviare messaggi, ma non riceverli, e continuare comunque a ricevere ordini dai clienti senza però poterli elaborare.For example, a system that can send messages but not receive them can still receive orders from customers but cannot process those orders. Questo argomento illustra i problemi che possono verificarsi e le tecniche per attenuarne gli effetti.This topic discusses potential issues that can occur, and how those issues are mitigated. Nel bus di servizio sono state introdotte numerose misure di prevenzione che richiedono un consenso esplicito, le cui regole d'uso sono illustrate in questo argomento.Service Bus has introduced a number of mitigations which you must opt into, and this topic also discusses the rules governing the use of those opt-in mitigations.

Affidabilità nel bus di servizioReliability in Service Bus

Sono disponibili diverse modalità di gestione dei problemi relativi a entità e messaggi, oltre a linee guida per l'utilizzo appropriato di queste misure di prevenzione.There are several ways to handle message and entity issues, and there are guidelines governing the appropriate use of those mitigations. Per comprendere le linee guida, è necessario comprendere prima di tutto i motivi per cui nel bus di servizio si possono verificare errori.To understand the guidelines, you must first understand what can fail in Service Bus. Considerata la progettazione dei sistemi Azure, tutti questi problemi sono in genere di breve durata.Due to the design of Azure systems, all of these issues tend to be short-lived. Ad alto livello, le diverse cause della mancata disponibilità si manifestano nei modi seguenti:At a high level, the different causes of unavailability appear as follows:

  • Limitazione da un sistema esterno dal quale dipende il bus di servizio.Throttling from an external system on which Service Bus depends. La limitazione è generata da interazioni con le risorse di archiviazione e calcolo.Throttling occurs from interactions with storage and compute resources.
  • Problema dovuto a un sistema dal quale dipende il bus di servizio.Issue for a system on which Service Bus depends. Ad esempio, problemi che possono verificarsi in una determinata risorsa di archiviazione.For example, a given part of storage can encounter issues.
  • Errore del bus di servizio in un singolo sottosistema.Failure of Service Bus on single subsystem. In questo caso, è possibile che un nodo di calcolo si trovi in uno stato incoerente e debba essere riavviato, causando il bilanciamento del carico in altri nodi di tutte le entità servite.In this situation, a compute node can get into an inconsistent state and must restart itself, causing all entities it serves to load balance to other nodes. Questa situazione può causare a sua volta un breve periodo di elaborazione lenta dei messaggi.This in turn can cause a short period of slow message processing.
  • Errore del bus di servizio in un data center di Azure.Failure of Service Bus within an Azure datacenter. Questo è un "errore irreversibile" durante il quale il sistema risulta irraggiungibile per diversi minuti o per alcune ore.This is a "catastrophic failure" during which the system is unreachable for many minutes or a few hours.

Nota

Il termine archiviazione può indicare sia archiviazione di Azure sia di SQL Azure.The term storage can mean both Azure Storage and SQL Azure.

Nel bus di servizio sono disponibili diverse misure di prevenzione per questi problemi.Service Bus contains a number of mitigations for these issues. Le sezioni seguenti illustrano ogni problema e le relative misure di prevenzione.The following sections discuss each issue and their respective mitigations.

LimitazioneThrottling

Nel bus di servizio la limitazione consente la gestione congiunta della frequenza dei messaggi.With Service Bus, throttling enables cooperative message rate management. Ogni singolo nodo del bus di servizio ospita molte entità,Each individual Service Bus node houses many entities. ognuna delle quali invia richieste al sistema in termini di CPU, memoria, archiviazione e altri facet.Each of those entities makes demands on the system in terms of CPU, memory, storage, and other facets. Quando uno di questi facet individua un utilizzo superiore alla soglia predefinita, il bus di servizio può negare una richiesta specifica.When any of these facets detects usage that exceeds defined thresholds, Service Bus can deny a given request. Il chiamante riceve un'eccezione di tipo ServerBusyException e riprova dopo 10 secondi.The caller receives a ServerBusyException and retries after 10 seconds.

Come misura di prevenzione, il codice deve leggere l'errore e bloccare ogni nuovo tentativo del messaggio per almeno 10 secondi.As a mitigation, the code must read the error and halt any retries of the message for at least 10 seconds. Poiché l'errore può verificarsi in varie parti dell'applicazione del cliente, si presuppone che ogni parte esegua indipendentemente la logica di ripetizione dei tentativi.Since the error can happen across pieces of the customer application, it is expected that each piece independently executes the retry logic. Il codice può ridurre l'occorrenza delle limitazioni abilitando il partizionamento di una coda o un argomento.The code can reduce the probability of being throttled by enabling partitioning on a queue or topic.

Problema per una dipendenza di AzureIssue for an Azure dependency

Anche per altri componenti di Azure possono occasionalmente verificarsi problemi di servizio.Other components within Azure can occasionally have service issues. Quando, ad esempio, si aggiorna un sistema usato dal bus di servizio, è possibile che il sistema funzioni temporaneamente con capacità limitate.For example, when a system that Service Bus uses is being upgraded, that system can temporarily experience reduced capabilities. Per risolvere questo tipo di problemi, il bus di servizio analizza e implementa regolarmente le misure di prevenzione.To work around these types of issues, Service Bus regularly investigates and implements mitigations. È tuttavia possibile che si verifichino effetti collaterali di misure di prevenzione.Side effects of these mitigations do appear. Ad esempio, per gestire problemi temporanei con l'archiviazione, il bus di servizio implementa un sistema che consente il funzionamento uniforme delle operazioni di invio dei messaggi. For example, to handle transient issues with storage, Service Bus implements a system that allows message send operations to work consistently. Considerata la natura della misura di prevenzione, un messaggio inviato può impiegare fino a 15 minuti prima di essere visualizzato nella sottoscrizione o nella coda interessata ed essere pronto per un'operazione di ricezione.Due to the nature of the mitigation, a sent message can take up to 15 minutes to appear in the affected queue or subscription and be ready for a receive operation. In genere, la maggior parte delle entità non è interessata da questo problema.Generally speaking, most entities will not experience this issue. Dato tuttavia il numero di entità presenti nel bus di servizio all'interno di Azure, questa misura di prevenzione può essere utile a volte per un limitato sottoinsieme di clienti del bus di servizio.However, given the number of entities in Service Bus within Azure, this mitigation is sometimes needed for a small subset of Service Bus customers.

Errore del bus di servizio in un singolo sottosistemaService Bus failure on a single subsystem

In qualsiasi applicazione possono verificarsi casi in cui un componente interno del bus di servizio diventa incoerente.With any application, circumstances can cause an internal component of Service Bus to become inconsistent. Quando il bus di servizio rileva questo problema, raccoglie dati dall'applicazione a fini diagnostici.When Service Bus detects this, it collects data from the application to aid in diagnosing what happened. Una volta raccolti i dati, l'applicazione viene riavviata nel tentativo di ripristinarne un stato coerente.Once the data is collected, the application is restarted in an attempt to return it to a consistent state. Questo processo avviene abbastanza velocemente e causa la mancata disponibilità di un'entità per alcuni minuti, anche se in genere i tempi di inattività sono molto più brevi.This process happens fairly quickly, and results in an entity appearing to be unavailable for up to a few minutes, though typical down times are much shorter.

In questi casi, l'applicazione client genera un'eccezione di tipo System.TimeoutException o MessagingException.In these cases, the client application generates a System.TimeoutException or MessagingException exception. Il bus di servizio include una misura di prevenzione per questo problema basata sulla logica di ripetizione automatica dei tentativi del client.Service Bus contains a mitigation for this issue in the form of automated client retry logic. Al termine del periodo di ripetizione, se il messaggio non è stato recapitato, è possibile provare a usare altre funzionalità, ad esempio gli spazi dei nomi associati.Once the retry period is exhausted and the message is not delivered, you can explore using other features such as paired namespaces. Questi ultimi presentano altri ostacoli che sono illustrati in questo articolo.Paired namespaces have other caveats that are discussed in that article.

Errore del bus di servizio in un data center di AzureFailure of Service Bus within an Azure datacenter

Il motivo più probabile di un errore in un data center di Azure è una distribuzione di aggiornamento non riuscita del bus di servizio o di un sistema dipendente.The most probable reason for a failure in an Azure datacenter is a failed upgrade deployment of Service Bus or a dependent system. Poiché la piattaforma è stata migliorata, la probabilità di questo tipo di errore è diminuita.As the platform has matured, the likelihood of this type of failure has diminished. Un errore di un data center può verificarsi anche per i motivi seguenti:A datacenter failure can also happen for reasons that include the following:

  • Interruzione elettrica (arresto di alimentazione e produzione di energia).Electrical outage (power supply and generating power disappear).
  • Connettività (interruzione della connessione Internet tra i client e Azure).Connectivity (internet break between your clients and Azure).

In entrambi i casi, il problema è dovuto a una calamità naturale o a un errore umano.In both cases, a natural or man-made disaster caused the issue. Per aggirare il problema e assicurarsi di poter continuare a inviare messaggi, è possibile usare gli spazi dei nomi associati per attivare l'invio dei messaggi a una seconda destinazione mentre viene ristabilita l'integrità della prima destinazione.To work around this and make sure that you can still send messages, you can use paired namespaces to enable messages to be sent to a second location while the primary location is made healthy again. Per altre informazioni, vedere Procedure consigliate per isolare le applicazioni del bus di servizio da interruzioni ed emergenze del servizio.For more information, see Best practices for insulating applications against Service Bus outages and disasters.

Spazi dei nomi associatiPaired namespaces

La funzionalità degli spazi dei nomi associati supporta scenari in cui un'entità o una distribuzione del bus di servizio in un data center diventa non disponibile.The paired namespaces feature supports scenarios in which a Service Bus entity or deployment within a data center becomes unavailable. Anche se eventi di questo tipo si verificano raramente, i sistemi distribuiti devono comunque essere in grado di gestire gli scenari peggiori.While this event occurs infrequently, distributed systems still must be prepared to handle worst case scenarios. In genere, questo tipo di evento si verifica perché in qualche elemento dal quale dipende il bus di servizio avviene un problema di breve durata.Typically, this event happens because some element on which Service Bus depends is experiencing a short-term issue. Per garantire la disponibilità di un'applicazione durante un'interruzione, gli utenti del bus di servizio possono usare due diversi spazi dei nomi, preferibilmente in due distinti data center, per ospitare le proprie entità di messaggistica.To maintain application availability during an outage, Service Bus users can use two separate namespaces, preferably in separate data centers, to host their messaging entities. Nel resto di questa sezione si userà la terminologia seguente:The remainder of this section uses the following terminology:

  • Spazio dei nomi primario: spazio dei nomi con cui interagisce l'applicazione per operazioni di invio e ricezione.Primary namespace: The namespace with which your application interacts, for send and receive operations.
  • Spazio dei nomi secondario: spazio dei nomi che agisce come backup dello spazio dei nomi primario.Secondary namespace: The namespace that acts as a backup to the primary namespace. La logica dell'applicazione non interagisce con questo spazio dei nomi.Application logic does not interact with this namespace.
  • Intervallo di failover: intervallo di tempo per accettare gli errori normali prima che l'applicazione passi dallo spazio dei nomi primario a quello secondario.Failover interval: The amount of time to accept normal failures before the application switches from the primary namespace to the secondary namespace.

Gli spazi dei nomi associati supportano sendavailability,Paired namespaces support send availability. che consente di preservare la capacità di inviare messaggi.Send availability preserves the ability to send messages. Per usare la funzionalità SendAvailability, l'applicazione deve soddisfare i requisiti seguenti:To use send availability, your application must meet the following requirements:

  1. I messaggi vengono ricevuti solo dallo spazio dei nomi primario.Messages are only received from the primary namespace.
  2. I messaggi inviati a una coda o a un argomento specifico possono arrivare senza un ordine preciso.Messages sent to a given queue or topic might arrive out of order.
  3. I messaggi in una sessione possono arrivare senza un ordine preciso.Messages within a session might arrive out of order. Questa è un'interruzione rispetto alla normale funzionalità delle sessioni,This is a break from normal functionality of sessions. che sta a indicare che l'applicazione usa le sessioni per il raggruppamento logico dei messaggi.This means that your application uses sessions to logically group messages.
  4. Lo stato delle sessioni viene mantenuto solo nello spazio dei nomi primario.Session state is only maintained on the primary namespace.
  5. La coda primaria può tornare online e iniziare ad accettare i messaggi prima che la coda secondaria recapiti tutti i messaggi alla coda primaria.The primary queue can come online and start accepting messages before the secondary queue delivers all messages into the primary queue.

Le sezioni seguenti illustrano l'API, la relativa modalità di implementazione e il codice di esempio che usa la funzionalità.The following sections discuss the APIs, how the APIs are implemented, and shows sample code that uses the feature. Si noti che a questa funzionalità sono associati costi di fatturazione.Note that there are billing implications associated with this feature.

API MessagingFactory.PairNamespaceAsyncThe MessagingFactory.PairNamespaceAsync API

La funzionalità degli spazi dei nomi associati include il metodo PairNamespaceAsync sulla classe Microsoft.ServiceBus.Messaging.MessagingFactory:The paired namespaces feature includes the PairNamespaceAsync method on the Microsoft.ServiceBus.Messaging.MessagingFactory class:

public Task PairNamespaceAsync(PairedNamespaceOptions options);

Quando l'attività è terminata, l'associazione degli spazi dei nomi è completa e pronta ad avere effetto su qualsiasi oggetto MessageReceiver, QueueClient o TopicClient creato con l'istanza MessagingFactory.When the task completes, the namespace pairing is also complete and ready to act upon for any MessageReceiver, QueueClient, or TopicClient created with the MessagingFactory instance. Microsoft.ServiceBus.Messaging.PairedNamespaceOptions è la classe di base per i vari tipi di associazioni disponibili con un oggetto MessagingFactory.Microsoft.ServiceBus.Messaging.PairedNamespaceOptions is the base class for the different types of pairing that are available with a MessagingFactory object. SendAvailabilityPairedNamespaceOptions è attualmente l'unica classe derivata che implementa i requisiti della funzionalità SendAvailability.Currently, the only derived class is one named SendAvailabilityPairedNamespaceOptions, which implements the send availability requirements. La classe SendAvailabilityPairedNamespaceOptions include un set di costruttori che si basano tra loro.SendAvailabilityPairedNamespaceOptions has a set of constructors that build on each other. Se si osserva il costruttore con il maggior numero di parametri, è possibile comprendere il comportamento degli altri.Looking at the constructor with the most parameters, you can understand the behavior of the other constructors.

public SendAvailabilityPairedNamespaceOptions(
    NamespaceManager secondaryNamespaceManager,
    MessagingFactory messagingFactory,
    int backlogQueueCount,
    TimeSpan failoverInterval,
    bool enableSyphon)

Ecco il significato di questi parametri:These parameters have the following meanings:

  • secondaryNamespaceManager: istanza inizializzata di NamespaceManager per lo spazio dei nomi secondario che può essere usata dal metodo PairNamespaceAsync per configurare lo spazio dei nomi secondario.secondaryNamespaceManager: An initialized NamespaceManager instance for the secondary namespace that the PairNamespaceAsync method can use to set up the secondary namespace. Il gestore dello spazio dei nomi viene usato per ottenere l'elenco di code nello spazio dei nomi e assicurarsi che esistano le code di backlog necessarie.The namespace manager is used to obtain the list of queues in the namespace and to make sure that the required backlog queues exist. Se le code non esistono, vengono create.If those queues do not exist, they are created. NamespaceManager richiede la possibilità di creare un token con l'attestazione Manage.NamespaceManager requires the ability to create a token with the Manage claim.
  • messagingFactory: istanza di MessagingFactory per lo spazio dei nomi secondario.messagingFactory: The MessagingFactory instance for the secondary namespace. L'oggetto MessagingFactory viene usato per inviare e, se la proprietà EnableSyphon è impostata su true, ricevere messaggi dalle code di backlog.The MessagingFactory object is used to send and, if the EnableSyphon property is set to true, receive messages from the backlog queues.
  • backlogQueueCount: numero di code di backlog da creare.backlogQueueCount: The number of backlog queues to create. Il valore deve essere almeno 1.This value must be at least 1. Quando si inviano messaggi al backlog, viene scelta casualmente una di queste code.When sending messages to the backlog, one of these queues is randomly chosen. Se il valore è impostato su 1, è possibile usare una sola coda.If you set the value to 1, then only one queue can ever be used. In questo caso e se l'unica coda di backlog genera errori, il client non è in grado di usare un'altra coda di backlog e potrebbe non riuscire a inviare il messaggio.When this happens and the one backlog queue generates errors, the client is not able to try a different backlog queue and may fail to send your message. È quindi consigliabile impostare questo parametro su un valore maggiore e impostare il valore predefinito su 10.We recommend setting this value to some larger value and default the value to 10. Il parametro può essere impostato su un valore superiore o inferiore in base ai dati che vengono inviati dall'applicazione ogni giorno.You can change this to a higher or lower value depending on how much data your application sends per day. Ogni coda di backlog può contenere fino a 5 GB di messaggi.Each backlog queue can hold up to 5 GB of messages.
  • failoverInterval: intervallo di tempo durante il quale vengono accettati errori nello spazio dei nomi primario, prima di passare ogni singola entità allo spazio dei nomi secondario.failoverInterval: The amount of time during which you will accept failures on the primary namespace before switching any single entity over to the secondary namespace. I failover si verificano su un'entità alla volta.Failovers occur on an entity-by-entity basis. Le entità in un singolo spazio dei nomi di solito risiedono in nodi diversi del bus di servizio.Entities in a single namespace frequently live in different nodes within Service Bus. Un errore in un'entità non implica che si verifichi in un'altra entità.A failure in one entity does not imply a failure in another. È possibile impostare questo valore su System.TimeSpan.Zero per eseguire il failover allo spazio dei nomi secondario immediatamente dopo il primo errore non temporaneo.You can set this value to System.TimeSpan.Zero to failover to the secondary immediately after your first, non-transient failure. Gli errori che attivano il timer del failover sono eccezioni di tipo MessagingException, in cui la proprietà IsTransient è false, o di tipo System.TimeoutException.Failures that trigger the failover timer are any MessagingException in which the IsTransient property is false, or a System.TimeoutException. Altri tipi di eccezioni, ad esempio UnauthorizedAccessException, non causano failover, perché indicano che il client non è configurato in modo corretto.Other exceptions, such as UnauthorizedAccessException do not cause failover, because they indicate that the client is configured incorrectly. Un'eccezione di tipo ServerBusyException non causa failover perché il modello corretto prevede un'attesa di 10 secondi e determina un nuovo invio del messaggio.A ServerBusyException does not cause failover because the correct pattern is to wait 10 seconds, then send the message again.
  • enableSyphon: indica che l'associazione specificata dovrebbe spostare i messaggi dallo spazio dei nomi secondario a quello primario.enableSyphon: Indicates that this particular pairing should also syphon messages from the secondary namespace back to the primary namespace. In genere nelle applicazioni che inviano messaggi questo valore deve essere impostato su false e in quelle che ricevono messaggi deve essere impostato su true.In general, applications that send messages should set this value to false; applications that receive messages should set this value to true. Il motivo per cui si verifica questo tipo di errore è dato dal fatto che spesso il numero dei destinatari dei messaggi è inferiore a quello dei mittenti.The reason for this is that frequently, there are fewer message receivers than message senders. A seconda del numero dei destinatari, è possibile scegliere di impostare un'unica istanza dell'applicazione per la gestione delle attività del sifone.Depending on the number of receivers, you can choose to have a single application instance handle the syphon duties. All'uso di più destinatari sono associati costi di fatturazione per ogni coda di backlog.Using many receivers has billing implications for each backlog queue.

Per usare il codice, creare un'istanza primaria di MessagingFactory, un'istanza secondaria di MessagingFactory e di NamespaceManager e un'istanza di SendAvailabilityPairedNamespaceOptions.To use the code, create a primary MessagingFactory instance, a secondary MessagingFactory instance, a secondary NamespaceManager instance, and a SendAvailabilityPairedNamespaceOptions instance. La chiamata può essere semplice come la seguente:The call can be as simple as the following:

SendAvailabilityPairedNamespaceOptions sendAvailabilityOptions = new SendAvailabilityPairedNamespaceOptions(secondaryNamespaceManager, secondary);
primary.PairNamespaceAsync(sendAvailabilityOptions).Wait();

Quando l'attività restituita dal metodo PairNamespaceAsync è completa, ogni componente è configurato e pronto per l'uso.When the task returned by the PairNamespaceAsync method completes, everything is set up and ready to use. Prima della restituzione dell'attività, è possibile che non siano state completate tutte le attività in background necessarie per il corretto funzionamento dell'associazione.Before the task is returned, you may not have completed all of the background work necessary for the pairing to work right. È quindi consigliabile non iniziare a inviare messaggi prima della restituzione dell'attività.As a result, you should not start sending messages until the task returns. Se si verifica un errore, dovuto ad esempio a credenziali errate o all'impossibilità di creare code di backlog, le eccezioni verranno restituite al completamento dell'attività.If any failures occurred, such as bad credentials, or failure to create the backlog queues, those exceptions will be thrown once the task completes. Dopo la restituzione dell'attività, verificare che siano state trovate o create le code esaminando la proprietà BacklogQueueCount nell'istanza di SendAvailabilityPairedNamespaceOptions.Once the task returns, verify that the queues were found or created by examining the BacklogQueueCount property on your SendAvailabilityPairedNamespaceOptions instance. In base al codice precedente, questa operazione viene visualizzata nel modo seguente:For the preceding code, that operation appears as follows:

if (sendAvailabilityOptions.BacklogQueueCount < 1)
{
    // Handle case where no queues were created.
}

Passaggi successiviNext steps

Dopo avere appreso le nozioni di base della messaggistica asincrona nel bus di servizio, leggere altre informazioni sugli spazi dei nomi associati.Now that you've learned the basics of asynchronous messaging in Service Bus, read more details about paired namespaces.