Procedure consigliate per isolare le applicazioni del bus di servizio da interruzioni ed emergenze del servizioBest practices for insulating applications against Service Bus outages and disasters

Le applicazioni criciali devono funzionare in modo continuo, anche in presenza di interruzioni impreviste o situazioni di emergenza.Mission-critical applications must operate continuously, even in the presence of unplanned outages or disasters. Questo argomento descrive le tecniche che è possibile usare per proteggere le applicazioni del bus di servizio da una potenziale emergenza o interruzione del servizio.This topic describes techniques you can use to protect Service Bus applications against a potential service outage or disaster.

Il termine "interruzione" indica la temporanea indisponibilità del bus di servizio di Azure.An outage is defined as the temporary unavailability of Azure Service Bus. Un'interruzione può interessare alcuni componenti del bus di servizio, ad esempio un archivio di messaggistica, o anche l'intero data center.The outage can affect some components of Service Bus, such as a messaging store, or even the entire datacenter. Una volta risolto il problema, il bus di servizio torna di nuovo disponibile.After the problem has been fixed, Service Bus becomes available again. In genere, un'interruzione non determina la perdita di messaggi o di altri dati.Typically, an outage does not cause loss of messages or other data. Un esempio di errore di un componente è la mancata disponibilità di un particolare archivio di messaggistica.An example of a component failure is the unavailability of a particular messaging store. Un esempio di interruzione a livello di data center è un'interruzione dell'alimentazione o il guasto di un commutatore di rete.An example of a datacenter-wide outage is a power failure of the datacenter, or a faulty datacenter network switch. Un'interruzione può durare da pochi minuti ad alcuni giorni.An outage can last from a few minutes to a few days.

Il termine "emergenza" indica la perdita permanente di un'unità di scala del bus di servizio o di un data center.A disaster is defined as the permanent loss of a Service Bus scale unit or datacenter. È possibile che il data center non torni di nuovo disponibile.The datacenter may or may not become available again. In genere, un'emergenza determina la perdita di alcuni o di tutti i messaggi o di altri dati.Typically a disaster causes loss of some or all messages or other data. Un'emergenza può essere causata, ad esempio, da un incendio, un'inondazione o un terremoto.Examples of disasters are fire, flooding, or earthquake.

Architettura correnteCurrent architecture

Il bus di servizio usa più archivi di messaggistica per memorizzare messaggi inviati a code o argomenti.Service Bus uses multiple messaging stores to store messages that are sent to queues or topics. Una coda o un argomento non partizionato viene assegnato a un archivio di messaggistica.A non-partitioned queue or topic is assigned to one messaging store. Se l'archivio di messaggistica in questione non è disponibile, tutte le operazioni eseguite sulla coda o sull'argomento avranno esito negativo.If this messaging store is unavailable, all operations on that queue or topic will fail.

Tutte le entità del bus di servizio (code, argomenti, inoltri) risiedono in uno spazio dei nomi di servizio che è affiliato a un data center.All Service Bus messaging entities (queues, topics, relays) reside in a service namespace, which is affiliated with a datacenter. Il bus di servizio non abilita la replica geografica automatica dei dati, né consente a uno spazio dei nomi di estendersi su più data center.Service Bus does not enable automatic geo-replication of data, nor does it allow a namespace to span multiple datacenters.

Protezione da interruzioni del servizio di controllo di accesso (ACS)Protecting against ACS outages

Se si usano credenziali ACS e il servizio ACS non è disponibile, i client non possono più ottenere i token.If you are using ACS credentials, and ACS becomes unavailable, clients can no longer obtain tokens. I client che dispongono di un token nel momento in cui ACS si arresta possono continuare a usare il bus di servizio fino alla scadenza dei token.Clients that have a token at the time ACS goes down can continue to use Service Bus until the tokens expire. La durata predefinita dei token è 3 ore.The default token lifetime is 3 hours.

Per proteggersi dalle interruzioni del servizio ACS, usare token di firma di accesso condiviso.To protect against ACS outages, use Shared Access Signature (SAS) tokens. In questo caso, il client esegue direttamente l'autenticazione con il bus di servizio firmando un token coniato automaticamente con una chiave privata.In this case, the client authenticates directly with Service Bus by signing a self-minted token with a secret key. Non sono più necessarie chiamate ad ACS.Calls to ACS are no longer required. Per altre informazioni sulla configurazione dei token di firma di accesso condiviso, vedere Autenticazione e autorizzazione del bus di servizio.For more information about SAS tokens, see Service Bus authentication.

Protezione di code e argomenti da errori degli archivi di messaggisticaProtecting queues and topics against messaging store failures

Una coda o un argomento non partizionato viene assegnato a un archivio di messaggistica.A non-partitioned queue or topic is assigned to one messaging store. Se l'archivio di messaggistica in questione non è disponibile, tutte le operazioni eseguite sulla coda o sull'argomento avranno esito negativo.If this messaging store is unavailable, all operations on that queue or topic will fail. Una coda partizionata, invece, è costituita da più frammenti,A partitioned queue, on the other hand, consists of multiple fragments. ciascuno dei quali memorizzato in un archivio di messaggistica differente.Each fragment is stored in a different messaging store. Quando un messaggio viene inviato a una coda o a un argomento partizionato, il bus di servizio assegna il messaggio a uno dei frammenti.When a message is sent to a partitioned queue or topic, Service Bus assigns the message to one of the fragments. Se l'archivio di messaggistica corrispondente non è disponibile, il bus di servizio scrive i messaggi in un frammento diverso, se possibile.If the corresponding messaging store is unavailable, Service Bus writes the message to a different fragment, if possible. Per altre informazioni sulle entità partizionate, vedere Code e argomenti partizionati.For more information about partitioned entities, see Partitioned messaging entities.

Protezione da interruzioni o emergenze dei data centerProtecting against datacenter outages or disasters

Per consentire un failover tra due data center, è possibile creare uno spazio dei nomi servizio del bus di servizio in ogni data center.To allow for a failover between two datacenters, you can create a Service Bus service namespace in each datacenter. Ad esempio, lo spazio dei nomi servizio del bus di servizio contosoPrimary.servicebus.windows.net potrebbe trovarsi nell'area centro-settentrionale degli Stati Uniti, mentre contosoSecondary.servicebus.windows.net potrebbe trovarsi in quella centro-meridionale.For example, the Service Bus service namespace contosoPrimary.servicebus.windows.net might be located in the United States North/Central region, and contosoSecondary.servicebus.windows.net might be located in the US South/Central region. Se un'entità di messaggistica del bus di servizio deve rimanere accessibile in caso di interruzione del data center, è possibile creare l'entità in entrambi gli spazi dei nomi.If a Service Bus messaging entity must remain accessible in the presence of a datacenter outage, you can create that entity in both namespaces.

Per altre informazioni, vedere la sezione "Errore del bus di servizio in un data center di Azure" in Modelli di messaggistica asincrona e disponibilità elevata.For more information, see the "Failure of Service Bus within an Azure datacenter" section in Asynchronous messaging patterns and high availability.

Protezione degli endpoint di inoltro da interruzioni o emergenze dei data centerProtecting relay endpoints against datacenter outages or disasters

La replica geografica degli endpoint di inoltro consente a un servizio che espone un endpoint di inoltro di essere raggiungibile in presenza di interruzioni del bus di servizio.Geo-replication of relay endpoints allows a service that exposes a relay endpoint to be reachable in the presence of Service Bus outages. Per ottenere la replica geografica, il servizio deve creare due endpoint di inoltro in diverse istanze di spazio dei nomi servizio.To achieve geo-replication, the service must create two relay endpoints in different namespaces. Le due istanze di spazio dei nomi servizio devono trovarsi in data center diversi e i due endpoint devono avere nomi differenti.The namespaces must reside in different datacenters and the two endpoints must have different names. Ad esempio, un endpoint primario può essere raggiunto in contosoPrimary.servicebus.windows.net/myPrimaryService, mentre il corrispettivo endpoint secondario può essere raggiunto in contosoSecondary.servicebus.windows.net/mySecondaryService.For example, a primary endpoint can be reached under contosoPrimary.servicebus.windows.net/myPrimaryService, while its secondary counterpart can be reached under contosoSecondary.servicebus.windows.net/mySecondaryService.

Il servizio rimane quindi in ascolto su entrambi gli endpoint e un client può richiamare il servizio tramite l'uno o l'altro.The service then listens on both endpoints, and a client can invoke the service via either endpoint. Un'applicazione client seleziona casualmente uno degli inoltri come endpoint primario e invia la richiesta all'endpoint attivo.A client application randomly picks one of the relays as the primary endpoint, and sends its request to the active endpoint. Se l'operazione ha esito negativo e viene visualizzato un codice di errore, significa che l'endpoint di inoltro non è disponibile.If the operation fails with an error code, this failure indicates that the relay endpoint is not available. L'applicazione apre un canale per l'endpoint di backup e invia nuovamente la richiesta.The application opens a channel to the backup endpoint and reissues the request. A quel punto, l'endpoint attivo e quello di backup si scambiano i ruoli: l'applicazione client considera l'endpoint attivo precedente come nuovo endpoint di backup e l'endpoint di backup precedente come nuovo endpoint attivo.At that point the active and the backup endpoints switch roles: the client application considers the old active endpoint to be the new backup endpoint, and the old backup endpoint to be the new active endpoint. Se entrambe le operazioni di invio hanno esito negativo, i ruoli delle due entità rimangono invariati e viene restituito un errore.If both send operations fail, the roles of the two entities remain unchanged and an error is returned.

Protezione delle code e degli argomenti da interruzioni o emergenze dei data centerProtecting queues and topics against datacenter outages or disasters

Per ottenere resilienza in caso di possibili interruzioni dei data center durante l'uso della messaggistica negoziata, il bus di servizio supporta due approcci: replica attiva e replica passiva.To achieve resilience against datacenter outages when using brokered messaging, Service Bus supports two approaches: active and passive replication. Per ogni approccio, se una coda o un argomento specifico deve rimanere accessibile in presenza di un'interruzione del data center, è possibile creare tale coda o argomento in entrambi gli spazi dei nomi.For each approach, if a given queue or topic must remain accessible in the presence of a datacenter outage, you can create it in both namespaces. Entrambe le entità possono avere lo stesso nome.Both entities can have the same name. Ad esempio, una coda primaria può essere raggiunta in contosoPrimary.servicebus.windows.net/myQueue, mentre la rispettiva coda secondaria può essere raggiunta in contosoSecondary.servicebus.windows.net/myQueue.For example, a primary queue can be reached under contosoPrimary.servicebus.windows.net/myQueue, while its secondary counterpart can be reached under contosoSecondary.servicebus.windows.net/myQueue.

Se l'applicazione non richiede una comunicazione mittente-ricevitore permanente, può implementare una coda permanente sul lato client in modo da impedire la perdita di messaggi e proteggere il mittente da eventuali errori temporanei del bus di servizio.If the application does not require permanent sender-to-receiver communication, the application can implement a durable client-side queue to prevent message loss and to shield the sender from any transient Service Bus errors.

Replica attivaActive replication

La replica attiva usa entità in entrambi gli spazi dei nomi per ogni operazione.Active replication uses entities in both namespaces for every operation. Ogni client invia sempre due copie di un messaggio.Any client that sends a message sends two copies of the same message. La prima viene inviata all'entità primaria, ad esempio contosoPrimary.servicebus.windows.net/sales, la seconda all'entità secondaria, ad esempio contosoSecondary.servicebus.windows.net/sales.The first copy is sent to the primary entity (for example, contosoPrimary.servicebus.windows.net/sales), and the second copy of the message is sent to the secondary entity (for example, contosoSecondary.servicebus.windows.net/sales).

Un client riceve messaggi da entrambe le code.A client receives messages from both queues. Il ricevitore elabora la prima copia di un messaggio ed elimina la seconda.The receiver processes the first copy of a message, and the second copy is suppressed. Per eliminare i messaggi duplicati, il mittente deve contrassegnare ogni messaggio con un identificatore univoco.To suppress duplicate messages, the sender must tag each message with a unique identifier. Entrambe le copie del messaggio devono essere contrassegnate con lo stesso identificatore.Both copies of the message must be tagged with the same identifier. Per contrassegnare il messaggio, è possibile usare la proprietà BrokeredMessage.MessageId o BrokeredMessage.Label oppure una proprietà personalizzata.You can use the BrokeredMessage.MessageId or BrokeredMessage.Label properties, or a custom property to tag the message. Il ricevitore deve mantenere l'elenco dei messaggi già ricevuti.The receiver must maintain a list of messages that it has already received.

L'esempio relativo alla replica geografica con i messaggi negoziati del bus di servizio illustra la modalità di replica attiva delle entità di messaggistica.The Geo-replication with Service Bus Brokered Messages sample demonstrates active replication of messaging entities.

Nota

Nella replica attiva il numero delle operazioni raddoppia. Di conseguenza, questo approccio può comportare costi più elevati.The active replication approach doubles the number of operations, therefore this approach can lead to higher cost.

Replica passivaPassive replication

Quando non si verificano errori, nella replica passiva viene usata solo una delle due entità di messaggistica.In the fault-free case, passive replication uses only one of the two messaging entities. Un client invia il messaggio all'entità attiva.A client sends the message to the active entity. Se l'operazione sull'entità attiva non riesce e viene restituito un codice di errore per segnalare che il data center che ospita l'entità attiva potrebbe non essere disponibile, il client invia una copia del messaggio all'entità di backup.If the operation on the active entity fails with an error code that indicates the datacenter that hosts the active entity might be unavailable, the client sends a copy of the message to the backup entity. A quel punto, l'entità attiva e quella di backup si scambiano i ruoli: il client mittente considera l'entità attiva precedente come nuova entità di backup e l'entità di backup precedente come nuova entità attiva.At that point the active and the backup entities switch roles: the sending client considers the old active entity to be the new backup entity, and the old backup entity is the new active entity. Se entrambe le operazioni di invio hanno esito negativo, i ruoli delle due entità rimangono invariati e viene restituito un errore.If both send operations fail, the roles of the two entities remain unchanged and an error is returned.

Un client riceve messaggi da entrambe le code.A client receives messages from both queues. Poiché potrebbe ricevere due copie dello stesso messaggio, il ricevitore deve eliminare i messaggi duplicati.Because there is a chance that the receiver receives two copies of the same message, the receiver must suppress duplicate messages. È possibile eliminare i duplicati nel modo descritto per la replica attiva.You can suppress duplicates in the same way as described for active replication.

In genere, la replica passiva è più vantaggiosa di quella attiva perché nella maggior parte dei casi viene eseguita una sola operazione.In general, passive replication is more economical than active replication because in most cases only one operation is performed. La latenza, la velocità effettiva e il costo sono identici a quelli di uno scenario non replicato.Latency, throughput, and monetary cost are identical to the non-replicated scenario.

Quando si usa la replica passiva, negli scenari seguenti è possibile che i messaggi vengano persi o ricevuti due volte.When using passive replication, in the following scenarios messages can be lost or received twice:

  • Ritardo o perdita del messaggio: si supponga che il mittente abbia inviato con esito positivo un messaggio m1 alla coda primaria e che quindi la coda diventi non disponibile prima della ricezione di m1 da parte del ricevitore.Message delay or loss: Assume that the sender successfully sent a message m1 to the primary queue, and then the queue becomes unavailable before the receiver receives m1. Il mittente invia un secondo messaggio m2 alla coda secondaria.The sender sends a subsequent message m2 to the secondary queue. Se la coda primaria è temporaneamente non disponibile, m1 viene ricevuto solo quando la coda torna nuovamente disponibile.If the primary queue is temporarily unavailable, the receiver receives m1 after the queue becomes available again. In caso di emergenza, il destinatario potrebbe non ricevere mai m1.In case of a disaster, the receiver may never receive m1.
  • Ricezione di duplicati: si supponga che il mittente invii un messaggio m alla coda primaria.Duplicate reception: Assume that the sender sends a message m to the primary queue. Il bus di servizio elabora m ma non riesce a inviare una risposta.Service Bus successfully processes m but fails to send a response. Dopo il timeout dell'operazione di invio, il mittente invia una copia identica di m alla coda secondaria.After the send operation times out, the sender sends an identical copy of m to the secondary queue. Se la prima copia di m viene ricevuta prima che la coda primaria diventi non disponibile, le due copie di m verranno ricevute quasi contemporaneamente.If the receiver is able to receive the first copy of m before the primary queue becomes unavailable, the receiver receives both copies of m at approximately the same time. Se invece la prima copia di m non viene ricevuta prima che la coda primaria diventi non disponibile, il ricevitore riceverà inizialmente solo la seconda copia di m. L'altra copia di m verrà ricevuta quando la coda primaria diventerà disponibile.If the receiver is not able to receive the first copy of m before the primary queue becomes unavailable, the receiver initially receives only the second copy of m, but then receives a second copy of m when the primary queue becomes available.

L'esempio relativo alla replica geografica con i messaggi negoziati del bus di servizio illustra la modalità di replica passiva delle entità di messaggistica.The Geo-replication with Service Bus brokered messages sample demonstrates passive replication of messaging entities.

Passaggi successiviNext steps

Per altre informazioni sul ripristino di emergenza, vedere gli articoli seguenti:To learn more about disaster recovery, see these articles: