Dettagli di implementazione e implicazioni in termini di costi relativi allo spazio dei nomi associatoPaired namespace implementation details and cost implications

Il metodo PairNamespaceAsync, mediante un'istanza di SendAvailabilityPairedNamespaceOptions, esegue attività visibili per conto dell'utente.The PairNamespaceAsync method, using a SendAvailabilityPairedNamespaceOptions instance, performs visible tasks on your behalf. Poiché l'uso di questa funzionalità comporta considerazioni in termini di costi, è utile comprendere le attività eseguite in modo da prevederne il comportamento.Because there are cost considerations when using the feature, it is useful to understand those tasks so that you expect the behavior when it happens. L'API attiva automaticamente il comportamento seguente per conto dell'utente:The API engages the following automatic behavior on your behalf:

  • Creazione di code di backlog.Creation of backlog queues.
  • Creazione di un oggetto MessageSender che comunica con code o argomenti.Creation of a MessageSender object that talks to queues or topics.
  • Invio di messaggi ping a un'entità di messaggistica che diventa non disponibile, nel tentativo di rilevare il momento in cui questa diventa nuovamente disponibile.When a messaging entity becomes unavailable, sends ping messages to the entity in an attempt to detect when that entity becomes available again.
  • Creazione facoltativa di un set di message pump che spostano i messaggi dalle code di backlog a quelle primarie.Optionally creates of a set of “message pumps” that move messages from the backlog queues to the primary queues.
  • Coordinamento di eventi di chiusura o errore delle istanze di MessagingFactory primarie e secondarie.Coordinates closing/faulting of the primary and secondary MessagingFactory instances.

A livello generale, la funzionalità opera in questo modo: quando l'entità primaria è integra, non si verificano modifiche del comportamento.At a high level, the feature works as follows: when the primary entity is healthy, no behavior changes occur. Quando la durata di FailoverInterval scade e l'entità primaria non rileva invii riusciti dopo un'eccezione di tipo MessagingException o TimeoutException non temporanea, si verifica quanto segue:When the FailoverInterval duration elapses, and the primary entity sees no successful sends after a non-transient MessagingException or a TimeoutException, the following behavior occurs:

  1. Le operazioni di invio all'entità primaria vengono disabilitate e il sistema effettua il ping dell'entità primaria finché i ping non vengono recapitati correttamente.Send operations to the primary entity are disabled and the system pings the primary entity until pings can be successfully delivered.
  2. Viene selezionata una coda di backlog casuale.A random backlog queue is selected.
  3. Gli oggetti BrokeredMessage vengono instradati alla coda di backlog scelta.BrokeredMessage objects are routed to the chosen backlog queue.
  4. Se un'operazione di invio alla coda di backlog scelta non riesce, la coda viene estratta dalla rotazione e viene selezionata una nuova coda.If a send operation to the chosen backlog queue fails, that queue is pulled from the rotation and a new queue is selected. L'errore viene comunicato a tutti i mittenti nell'istanza di MessagingFactory.All senders on the MessagingFactory instance learn of the failure.

Le figure seguenti illustrano la sequenza.The following figures depict the sequence. Prima di tutto il mittente invia i messaggi.First, the sender sends messages.

Spazi dei nomi associati

Dal momento in cui si verifica l'errore di invio alla coda primaria, il mittente inizia a inviare i messaggi a una coda di backlog scelta casualmente.Upon failure to send to the primary queue, the sender begins sending messages to a randomly chosen backlog queue. Contemporaneamente avvia un'attività di ping.Simultaneously, it starts a ping task.

Spazi dei nomi associati

A questo punto i messaggi si trovano ancora nella coda secondaria e non sono stati recapitati a quella primaria.At this point the messages are still in the secondary queue and have not been delivered to the primary queue. Quando la coda primaria sarà di nuovo integra, è necessario che il sifone venga eseguito da almeno un processo.Once the primary queue is healthy again, at least one process should be running the syphon. Il sifone recapita i messaggi dalle varie code di backlog alle entità di destinazione appropriate, ad esempio code e argomenti.The syphon delivers the messages from all the various backlog queues to the proper destination entities (queues and topics).

Spazi dei nomi associati

Nelle sezioni successive di questo argomento verranno illustrati i dettagli specifici del funzionamento di questi componenti.The remainder of this topic discusses the specific details of how these pieces work.

Creazione di code di backlogCreation of backlog queues

L'oggetto SendAvailabilityPairedNamespaceOptions passato al metodo PairNamespaceAsync indica il numero di code di backlog da usare.The SendAvailabilityPairedNamespaceOptions object passed to the PairNamespaceAsync method indicates the number of backlog queues you want to use. Ogni coda di backlog viene quindi creata con le proprietà seguenti impostate in modo esplicito. Tutti gli altri valori vengono impostati in base all'oggetto QueueDescription predefinito:Each backlog queue is then created with the following properties explicitly set (all other values are set to the QueueDescription defaults):

PathPath [spazio dei nomi primario]/x-servicebus-transfer/[indice] dove [indice] è un valore espresso in [0, BacklogQueueCount][primary namespace]/x-servicebus-transfer/[index] where [index] is a value in [0, BacklogQueueCount)
MaxSizeInMegabytesMaxSizeInMegabytes 51205120
MaxDeliveryCountMaxDeliveryCount int.MaxValueint.MaxValue
DefaultMessageTimeToLiveDefaultMessageTimeToLive TimeSpan.MaxValueTimeSpan.MaxValue
AutoDeleteOnIdleAutoDeleteOnIdle TimeSpan.MaxValueTimeSpan.MaxValue
LockDurationLockDuration 1 minuto1 minute
EnableDeadLetteringOnMessageExpirationEnableDeadLetteringOnMessageExpiration truetrue
EnableBatchedOperationsEnableBatchedOperations truetrue

Ad esempio, la prima coda di backlog creata per lo spazio dei nomi contoso è denominata contoso/x-servicebus-transfer/0.For example, the first backlog queue created for namespace contoso is named contoso/x-servicebus-transfer/0.

Quando si creano le code, il codice verifica prima di tutto se una coda esiste.When creating the queues, the code first checks to see if such a queue exists. In caso contrario, la coda viene creata.If the queue does not exist, then the queue is created. Il codice non esegue la pulizia di code di backlog "aggiuntive".The code does not clean up "extra" backlog queues. In particolare, se per l'applicazione con lo spazio dei nomi primario contoso sono necessarie cinque code di backlog, ma esiste già una coda con percorso contoso/x-servicebus-transfer/7, la coda aggiuntiva risulta presente, ma non viene usata.Specifically, if the application with the primary namespace contoso requests five backlog queues but a backlog queue with the path contoso/x-servicebus-transfer/7 exists, that extra backlog queue is still present but is not used. Il sistema consente in modo esplicito la presenza di code di backlog aggiuntive che tuttavia non vengono usate.The system explicitly allows extra backlog queues to exist that would not be used. Come proprietario dello spazio dei nomi, l'utente è responsabile della pulizia di eventuali code di backlog inutilizzate o indesiderate.As the namespace owner, you are responsible for cleaning up any unused/unwanted backlog queues. Questa decisione è dovuta al fatto che il bus di servizio non è in grado di riconoscere lo scopo dell'esistenza di tutte le code nello spazio dei nomi.The reason for this decision is that Service Bus cannot know what purposes exist for all the queues in your namespace. Se esiste già anche una coda con il nome specificato, ma non soddisfa quanto definito in precedenza per l'oggetto QueueDescription, la modifica del comportamento predefinito dipende esclusivamente dai motivi definiti dall'utente.Furthermore, if a queue exists with the given name but does not meet the assumed QueueDescription, then your reasons are your own for changing the default behavior. Non vengono fornite garanzie riguardo alle modifiche apportate alle code di backlog dal codice dell'utente.No guarantees are made for modifications to the backlog queues by your code. Verificare quindi con attenzione le modifiche apportate.Make sure to test your changes thoroughly.

MessageSender personalizzatoCustom MessageSender

Quando vengono inviati, tutti i messaggi passano attraverso un oggetto MessageSender interno, che ha un comportamento normale quando tutto funziona correttamente, ma che esegue il reindirizzamento alle code di backlog in caso di errori.When sending, all messages go through an internal MessageSender object that behaves normally when everything works, and redirects to the backlog queues when things "break." Se viene rilevato un errore non temporaneo, viene avviato un timer.Upon receiving a non-transient failure, a timer starts. Dopo un periodo definito in TimeSpan corrispondente al valore della proprietà FailoverInterval, durante il quale non viene eseguito l'invio di messaggi, viene avviata la procedura di failover.After a TimeSpan period consisting of the FailoverInterval property value during which no successful messages are sent, the failover is engaged. A questo punto, per ogni entità si verifica quanto segue:At this point, the following things happen for each entity:

  • Viene eseguita un'attività ping per ogni PingPrimaryInterval, per verificare se l'entità è disponibile.A ping task executes every PingPrimaryInterval to check if the entity is available. Se questa attività riesce, tutto il codice client che usa l'entità inizia immediatamente a inviare nuovi messaggi allo spazio dei nomi primario.Once this task succeeds, all client code that uses the entity immediately starts sending new messages to the primary namespace.
  • Le richieste successive di invio alla stessa entità da qualsiasi altro mittente avranno come risultato l'invio di un oggetto BrokeredMessage che dovrà essere modificato per entrare nella coda di backlog.Future requests to send to that same entity from any other senders will result in the BrokeredMessage being sent to be modified to sit in the backlog queue. La modifica comporta la rimozione di alcune proprietà dall'oggetto BrokeredMessage e la relativa archiviazione in un'altra area.The modification removes some properties from the BrokeredMessage object and stores them elsewhere. Le proprietà seguenti vengono eliminate e aggiunte con un nuovo alias, per consentire al bus di servizio e all'SDK di elaborare i messaggi in modo uniforme:The following properties are cleared and added under a new alias, allowing Service Bus and the SDK to process messages uniformly:
Nome proprietà precedenteOld Property Name Nuovo nome proprietàNew Property Name
SessionIdSessionId x-ms-sessionidx-ms-sessionid
TimeToLiveTimeToLive x-ms-timetolivex-ms-timetolive
ScheduledEnqueueTimeUtcScheduledEnqueueTimeUtc x-ms-pathx-ms-path

Il percorso di destinazione originale viene archiviato anche nel messaggio come proprietà x-ms-path.The original destination path is also stored within the message as a property named x-ms-path. Questa progettazione consente la coesistenza in un'unica coda di backlog di messaggi appartenenti a più entità.This design allows messages for many entities to coexist in a single backlog queue. Le proprietà vengono ritrasferite dal sifone.The properties are translated back by the syphon.

Per l'oggetto MessageSender possono verificarsi problemi quando i messaggi raggiungono il limite di 256 KB e viene avviato il failover.The custom MessageSender object can encounter issues when messages approach the 256-KB limit and failover is engaged. L'oggetto MessageSender personalizzato archivia nelle code di backlog i messaggi per tutte le code e tutti gli argomenti.The custom MessageSender object stores messages for all queues and topics together in the backlog queues. Questo oggetto unisce i messaggi provenienti da numerose code primarie nelle code di backlog.This object mixes messages from many primaries together within the backlog queues. Per gestire il bilanciamento del carico tra più client che non hanno relazioni tra loro, l'SDK sceglie casualmente una coda di backlog per ogni oggetto QueueClient o TopicClient creato nel codice.To handle load balancing among many clients that do not know each other, the SDK randomly picks one backlog queue for each QueueClient or TopicClient you create in code.

PingPings

Un messaggio ping è un oggetto BrokeredMessage vuoto con la proprietà ContentType impostata su application/vnd.ms-servicebus-ping e un valore TimeToLive di 1 secondo.A ping message is an empty BrokeredMessage with its ContentType property set to application/vnd.ms-servicebus-ping and a TimeToLive value of 1 second. Questo ping presenta una caratteristica particolare nel bus di servizio. Il server non recapita mai un ping quando un chiamante qualsiasi richiede un oggetto BrokeredMessage.This ping has one special characteristic in Service Bus: the server never delivers a ping when any caller requests a BrokeredMessage. Di conseguenza, non sarà mai necessario comprendere come ricevere e ignorare questi messaggi.Thus, you never have to learn how to receive and ignore these messages. A ogni entità, argomento o coda univoca, per istanza di MessagingFactory e per client che risulta non disponibile viene inviato un ping.Each entity (unique queue or topic) per MessagingFactory instance per client will be pinged when they are considered to be unavailable. Per impostazione predefinita, ciò accade una volta al minuto.By default, this happens once per minute. I messaggi ping sono considerati come normali messaggi del bus di servizio e possono comportare l'addebito di costi in base alla larghezza di banda e al numero di messaggi.Ping messages are considered to be regular Service Bus messages, and can result in charges for bandwidth and messages. Non appena i client rilevano che il sistema è disponibile, l'invio di messaggi viene arrestato.As soon as the clients detect that the system is available, the messages stop.

SifoneThe syphon

Almeno un programma eseguibile nell'applicazione deve eseguire attivamente il sifone,At least one executable program in the application should be actively running the syphon. che avvia un'operazione di ricezione mediante polling prolungato della durata di 15 minuti.The syphon performs a long poll receive that lasts 15 minutes. Quando tutte le entità sono disponibili e sono presenti dieci code di backlog, l'applicazione che ospita il sifone chiama l'operazione di ricezione 40 volte all'ora, 960 volte al giorno e 28800 volte in 30 giorni.When all entities are available and you have 10 backlog queues, the application that hosts the syphon calls the receive operation 40 times per hour, 960 times per day, and 28800 times in 30 days. Quando il sifone sposta attivamente i messaggi dalla coda di backlog a quella primaria, per ciascun messaggio vengono applicati i costi riportati di seguito (costi standard relativi alle dimensioni del messaggio e all'impiego delle larghezza di banda nelle varie fasi):When the syphon is actively moving messages from the backlog to the primary queue, each message experiences the following charges (standard charges for message size and bandwidth apply in all stages):

  1. Invio alla coda di backlog.Send to the backlog.
  2. Ricezione dalla coda di backlog.Receive from the backlog.
  3. Invio alla coda primaria.Send to the primary.
  4. Ricezione dalla coda primaria.Receive from the primary.

Comportamento di chiusura o erroreClose/fault behavior

In un'applicazione che ospita il sifone, non appena l'oggetto MessagingFactory primario o secondario restituisce un errore o viene chiuso, senza che l'oggetto correlato restituisca un errore o venga chiuso, e non appena questo stato viene rilevato, il sifone si attiva automaticamente.Within an application that hosts the syphon, once the primary or secondary MessagingFactory faults or is closed without its partner also being faulted or closed and the syphon detects this state, the syphon acts. Se l'oggetto MessagingFactory correlato al primo non viene chiuso entro 5 secondi, il sifone restituisce un errore per l'oggetto MessagingFactory ancora aperto.If the other MessagingFactory is not closed within 5 seconds, the syphon faults the still open MessagingFactory.

Passaggi successiviNext steps

Per informazioni dettagliate sulla messaggistica asincrona del bus di servizio, vedere Modelli di messaggistica asincrona e disponibilità elevata.See Asynchronous messaging patterns and high availability for a detailed discussion of Service Bus asynchronous messaging.