Guida al protocollo AMQP 1.0 nel bus di servizio e in Hub eventi di AzureAMQP 1.0 in Azure Service Bus and Event Hubs protocol guide

AMQP (Advanced Message Queueing Protocol) 1.0 è un protocollo di frame e di trasferimento che consente di trasferire messaggi tra due parti in modo asincrono, sicuro e affidabile.The Advanced Message Queueing Protocol 1.0 is a standardized framing and transfer protocol for asynchronously, securely, and reliably transferring messages between two parties. È il protocollo principale della messaggistica del bus di servizio e di Hub eventi di Azure.It is the primary protocol of Azure Service Bus Messaging and Azure Event Hubs. Entrambi i servizi supportano anche HTTPS.Both services also support HTTPS. Il protocollo SBMP proprietario supportato verrà gradualmente sostituito da AMQP.The proprietary SBMP protocol that is also supported is being phased out in favor of AMQP.

AMQP 1.0 è il risultato di un'ampia collaborazione a livello di settore, tra fornitori di middleware, ad esempio Microsoft e Red Hat, e molti utenti di middleware di messaggistica, ad esempio JP Morgan Chase, che rappresenta il settore di servizi finanziari.AMQP 1.0 is the result of broad industry collaboration that brought together middleware vendors, such as Microsoft and Red Hat, with many messaging middleware users such as JP Morgan Chase representing the financial services industry. Il forum relativo alla standardizzazione tecnica per il protocollo AMQP e le specifiche relative alle estensioni è OASIS e ha ottenuto l'approvazione formale come standard internazionale in base alle norme ISO/IEC 19494.The technical standardization forum for the AMQP protocol and extension specifications is OASIS, and it has achieved formal approval as an international standard as ISO/IEC 19494.

ObiettiviGoals

Questo articolo riepiloga brevemente i concetti di base delle specifiche di messaggistica AMQP 1.0, oltre a un set ridotto di specifiche di estensioni provvisorie attualmente in fase di finalizzazione nel comitato tecnico di OASIS per AMQP, e spiega in che modo il bus di servizio di Azure implementa queste specifiche e si basa su di esse.This article briefly summarizes the core concepts of the AMQP 1.0 messaging specification along with a small set of draft extension specifications that are currently being finalized in the OASIS AMQP technical committee and explains how Azure Service Bus implements and builds on these specifications.

L'obiettivo consiste nel permettere a tutti gli sviluppatori che usano uno stack client AMQP 1.0 esistente su qualsiasi piattaforma di interagire con il bus di servizio di Azure tramite AMQP 1.0.The goal is for any developer using any existing AMQP 1.0 client stack on any platform to be able to interact with Azure Service Bus via AMQP 1.0.

Gli stack generici AMQP 1.0 comuni, ad esempio Apache Proton o AMQP.NET Lite, implementano già tutti i protocolli principali di AMQP 1.0.Common general-purpose AMQP 1.0 stacks, such as Apache Proton or AMQP.NET Lite, already implement all core AMQP 1.0 protocols. Questi gesti di base sono a volte inclusi in un'API di livello superiore. Apache Proton offre anche due API, ovvero l'essenziale Messenger API e l'API reattiva Reactor API.Those foundational gestures are sometimes wrapped with a higher-level API; Apache Proton even offers two, the imperative Messenger API and the reactive Reactor API.

Nella discussione che segue si presuppone che la gestione di connessioni, sessioni e collegamenti di AMQP e la gestione di trasferimenti di frame e del controllo di flusso siano a carico del rispettivo stack, ad esempio Apache Proton-C, e non richiedano attenzione specifica da parte degli sviluppatori di applicazioni.In the following discussion, we assume that the management of AMQP connections, sessions, and links and the handling of frame transfers and flow control are handled by the respective stack (such as Apache Proton-C) and do not require much if any specific attention from application developers. Si presuppone in modo astratto l'esistenza di alcune interfacce API primitive, ad esempio la possibilità di connettersi e di creare qualche genere di oggetti di astrazione sender e receiver, che includono rispettivamente un tipo di operazione send() e receive().We abstractly assume the existence of a few API primitives like the ability to connect, and to create some form of sender and receiver abstraction objects, which then have some shape of send() and receive() operations, respectively.

Durante l'analisi delle funzionalità avanzate del bus di servizio di Azure, ad esempio l'esplorazione dei messaggi o la gestione delle sessioni, questi aspetti vengono illustrati dal punto di vista di AMQP, ma anche dal punto di vista della pseudo-implementazione a più livelli sopra questa presupposta astrazione di API.When discussing advanced capabilities of Azure Service Bus, such as message browsing or management of sessions, those features are explained in AMQP terms, but also as a layered pseudo-implementation on top of this assumed API abstraction.

Informazioni su AMQPWhat is AMQP?

AMQP è un protocollo di frame e di trasferimento.AMQP is a framing and transfer protocol. Un protocollo di frame fornisce una struttura per i flussi di dati in ogni direzione di una connessione di rete.Framing means that it provides structure for binary data streams that flow in either direction of a network connection. La struttura fornisce una descrizione di blocchi distinti di dati, detti frame, da scambiare tra le parti connesse.The structure provides delineation for distinct blocks of data, called frames, to be exchanged between the connected parties. Le funzionalità di trasferimento assicurano che entrambe le parti possano raggiungere un accordo condiviso in merito al momento in cui i frame devono essere trasferiti e al momento in cui i trasferimenti devono essere considerati completi.The transfer capabilities make sure that both communicating parties can establish a shared understanding about when frames shall be transferred, and when transfers shall be considered complete.

A differenza delle versioni provvisorie scadute precedenti prodotte dal gruppo di lavoro di AMQP e ancora in uso da parte di alcuni broker messaggi, il protocollo AMQP 1.0 finale e standardizzato del gruppo di lavoro non richiede la presenza di un broker messaggi o di qualsiasi topologia specifica per entità all'interno di un broker messaggi.Unlike earlier expired draft versions produced by the AMQP working group that are still in use by a few message brokers, the working group's final, and standardized AMQP 1.0 protocol does not prescribe the presence of a message broker or any particular topology for entities inside a message broker.

Il protocollo può essere usato per la comunicazione peer-to-peer simmetrica con broker messaggi che supportano le query e pubblicano/sottoscrivono entità, analogamente al bus di servizio di Azure.The protocol can be used for symmetric peer-to-peer communication, for interaction with message brokers that support queues and publish/subscribe entities, as Azure Service Bus does. Può essere usato anche per l'interazione con l'infrastruttura di messaggistica, in cui i modelli di interazione sono diversi rispetto alle code regolari, come nel caso di Hub eventi di Azure.It can also be used for interaction with messaging infrastructure where the interaction patterns are different from regular queues, as is the case with Azure Event Hubs. Un hub eventi funziona in modo analogo a una coda in caso di invio di eventi all'hub, ma funziona in modo più simile a un servizio di archiviazione seriale quando gli eventi vengono letti dall'hub. È in qualche modo simile a un'unità a nastro.An Event Hub acts like a queue when events are sent to it, but acts more like a serial storage service when events are read from it; it somewhat resembles a tape drive. Il client sceglie un offset nel flusso di dati disponibile e riceve quindi tutti gli eventi da tale offset, fino all'evento più recente disponibile.The client picks an offset into the available data stream and is then served all events from that offset to the latest available.

Il protocollo AMQP 1.0 è progettato in modo da essere estensibile e da supportare specifiche aggiuntive che ne migliorano le funzionalità.The AMQP 1.0 protocol is designed to be extensible, enabling further specifications to enhance its capabilities. Questo aspetto è illustrato dalle tre specifiche di estensioni incluse in questo argomento.The three extension specifications discussed in this document illustrate this. Per comunicazioni sull'infrastruttura HTTPS/WebSocket esistente, in cui la configurazione di porte TCP AMQP native potrebbe risultare difficile, una specifica di associazione definisce il modo in cui creare livelli di AMQP su WebSocket.For communication over existing HTTPS/WebSockets infrastructure where configuring the native AMQP TCP ports may be difficult, a binding specification defines how to layer AMQP over WebSockets. Per l'interazione con l'infrastruttura di messaggistica in una modalità di richiesta/risposta per finalità di gestione o per offrire funzionalità avanzate, la specifica relativa alla gestione di AMQP definisce le primitive di interazione di base necessarie.For interacting with the messaging infrastructure in a request/response fashion for management purposes or to provide advanced functionality, the AMQP management specification defines the required basic interaction primitives. Per l'integrazione con il modello di autorizzazione federata, la specifica relativa alla sicurezza basata su attestazioni di AMQP definisce il modo in cui associare e rinnovare i token di autorizzazione associati ai collegamenti.For federated authorization model integration, the AMQP claims-based-security specification defines how to associate and renew authorization tokens associated with links.

Scenari AMQP di baseBasic AMQP scenarios

Questa sezione illustra l'uso di base di AMQP 1.0 con il bus di servizio di Azure, che include la creazione di connessioni, sessioni e collegamenti e il trasferimento di messaggi a e da entità del bus di servizio quali code, argomenti e sottoscrizioni.This section explains the basic usage of AMQP 1.0 with Azure Service Bus, which includes creating connections, sessions, and links, and transferring messages to and from Service Bus entities such as queues, topics, and subscriptions.

La fonte più autorevole per informazioni sul funzionamento di AMQP è costituita dalla specifica relativa ad AMQP 1.0, ma questa specifica è stata scritta in modo da illustrare l'implementazione, non per fornire istruzioni relative al protocollo.The most authoritative source to learn about how AMQP works is the AMQP 1.0 specification, but the specification was written to precisely guide implementation and not to teach the protocol. Questa sezione è incentrata sull'introduzione della terminologia necessaria per descrivere l'uso di AMQP 1.0 da parte del bus di servizio.This section focuses on introducing as much terminology as needed for describing how Service Bus uses AMQP 1.0. Per un'introduzione più completa ad AMQP e per una discussione più ampia su AMQP 1.0, vedere questa esercitazione video.For a more comprehensive introduction to AMQP, as well as a broader discussion of AMQP 1.0, you can review this video course.

Connessioni e sessioniConnections and sessions

AMQP definisce contenitori i programmi di comunicazione. I contenitori includono nodi, ovvero entità che comunicano all'interno di tali contenitori.AMQP calls the communicating programs containers; those contain nodes, which are the communicating entities inside of those containers. Una coda può essere un nodo di questo tipo.A queue can be such a node. AMQP consente il multiplexing, quindi una singola connessione può essere usata per molti percorsi di comunicazione tra i nodi. Un client applicazione, ad esempio, può ricevere contemporaneamente da una coda e inviare a un'altra coda sulla stessa connessione di rete.AMQP allows for multiplexing, so a single connection can be used for many communication paths between nodes; for example, an application client can concurrently receive from one queue and send to another queue over the same network connection.

La connessione di rete viene quindi ancorata al contenitore.The network connection is thus anchored on the container. Viene avviata dal contenitore nel ruolo client che effettua una connessione in uscita tramite socket TCP a un contenitore nel ruolo del ricevitore che è in ascolto e accetta connessioni TCP in ingresso.It is initiated by the container in the client role making an outbound TCP socket connection to a container in the receiver role, which listens for and accepts inbound TCP connections. L'handshake di connessione include la negoziazione della versione del protocollo, la dichiarazione o la negoziazione dell'uso di TLS/SSL (Transport Level Security) e un handshake di autenticazione/autorizzazione nell'ambito di connessione basato su SASL.The connection handshake includes negotiating the protocol version, declaring or negotiating the use of Transport Level Security (TLS/SSL), and an authentication/authorization handshake at the connection scope that is based on SASL.

Il bus di servizio di Azure richiede sempre l'uso di TLS.Azure Service Bus requires the use of TLS at all times. Supporta connessioni sulla porta TCP 5671. La connessione TCP viene prima di tutto sovrapposta a TLS prima dell'handshake del protocollo AMQP e supporta anche connessioni sulla porta TCP 5672, in cui il server offre immediatamente un aggiornamento obbligatorio della connessione a TLS usando il modello prescritto da AMQP.It supports connections over TCP port 5671, whereby the TCP connection is first overlaid with TLS before entering the AMQP protocol handshake, and also supports connections over TCP port 5672 whereby the server immediately offers a mandatory upgrade of connection to TLS using the AMQP-prescribed model. L'associazione a WebSocket AMQP crea un tunnel sulla porta TCP 443 che è quindi equivalente a connessioni di tipo AMQP 5671.The AMQP WebSockets binding creates a tunnel over TCP port 443 that is then equivalent to AMQP 5671 connections.

Dopo la configurazione della connessione e di TLS, il bus di servizio offre due opzioni per il meccanismo SASL:After setting up the connection and TLS, Service Bus offers two SASL mechanism options:

  • L'opzione SASL PLAIN viene usata solitamente per passare credenziali di tipo nome utente e password a un server.SASL PLAIN is commonly used for passing username and password credentials to a server. Il bus di servizio non ha account, ma regole di sicurezza di accesso condiviso denominate, che conferiscono diritti e sono associate a una chiave.Service Bus does not have accounts, but named Shared Access Security rules, which confer rights and are associated with a key. Il nome di una regola viene usato come nome utente e la chiave, sotto forma di testo con codifica Base64, viene usata come password.The name of a rule is used as the user name and the key (as base64 encoded text) is used as the password. I diritti associati alla regola scelta determinano le operazioni consentite sulla connessione.The rights associated with the chosen rule govern the operations allowed on the connection.
  • L'opzione SASL ANONYMOUS viene usata per ignorare l'autorizzazione SASL quando il client vuole usare il modello di sicurezza basato sulle attestazioni che viene illustrato più avanti.SASL ANONYMOUS is used for bypassing SASL authorization when the client wants to use the claims-based-security (CBS) model that is described later. Questa opzione consente di stabilire una connessione client in modo anonimo per un breve periodo di tempo, durante il quale il client può interagire solo con l'endpoint CBS e l'handshake CBS deve essere completato.With this option, a client connection can be established anonymously for a short time during which the client can only interact with the CBS endpoint and the CBS handshake must complete.

Dopo la creazione della connessione di trasporto, ogni contenitore dichiara una dimensione massima per i frame che è disposto a gestire e dopo il timeout di inattività corrispondente ogni contenitore si disconnette in modo unilaterale in caso di assenza di attività sulla connessione.After the transport connection is established, the containers each declare the maximum frame size they are willing to handle, and after an idle timeout they’ll unilaterally disconnect if there is no activity on the connection.

I contenitori dichiarano anche il numero di canali simultanei supportati.They also declare how many concurrent channels are supported. Un canale è un percorso di trasferimento virtuale, unidirezionale e in uscita sulla connessione.A channel is a unidirectional, outbound, virtual transfer path on top of the connection. Una sessione accetta un canale da ogni contenitore interconnesso per formare un percorso di comunicazione bidirezionale.A session takes a channel from each of the interconnected containers to form a bi-directional communication path.

Le sessioni hanno un modello di controllo del flusso basato su una finestra. Quando viene creata una sessione, ogni parte dichiara il numero di frame che è disposta ad accettare durante la rispettiva finestra di ricezione.Sessions have a window-based flow control model; when a session is created, each party declares how many frames it is willing to accept into its receive window. Quando le parti si scambiano i frame, i frame trasferiti completano tale finestra e i trasferimenti si arrestano quando la finestra è completa e fino a quando la finestra non viene reimpostata o espansa usando la performativa di flusso. Performativa è il termine di AMQP per i gesti a livello di protocollo scambiati tra le due parti.As the parties exchange frames, transferred frames fill that window and transfers stop when the window is full and until the window gets reset or expanded using the flow performative (performative is the AMQP term for protocol-level gestures exchanged between the two parties).

Il modello basato su finestra è quasi equivalente al concetto TCP del controllo di flusso basato su finestra, ma a livello di sessione all'interno del socket.This window-based model is roughly analogous to the TCP concept of window-based flow control, but at the session level inside the socket. Il concetto del protocollo che permette più sessioni contemporanee consente di dare la precedenza al traffico a priorità elevata rispetto al traffico normale con limitazioni.The protocol’s concept of allowing for multiple concurrent sessions exists so that high priority traffic could be rushed past throttled normal traffic, like on a highway express lane.

Il bus di servizio di Azure usa attualmente esattamente una sessione per ogni connessione.Azure Service Bus currently uses exactly one session for each connection. La dimensione massima di frame per il bus di servizio è di 262.144 byte (256 KB) per il bus di servizio Standard e gli Hub eventi.The Service Bus maximum frame-size is 262,144 bytes (256 K bytes) for Service Bus Standard and Event Hubs. È pari a 1.048.576 (1 MB) per il bus di servizio Premium.It is 1,048,576 (1 MB) for Service Bus Premium. Il bus di servizio non impone alcuna finestra di limitazione specifica a livello di sessione, ma reimposta regolarmente la finestra come parte del controllo di flusso a livello di collegamento. Vedere la sezione successiva.Service Bus does not impose any particular session-level throttling windows, but resets the window regularly as part of link-level flow control (see the next section).

Le connessioni, le sessioni e i canali sono temporanei.Connections, channels, and sessions are ephemeral. In caso di interruzione della connessione sottostante, è necessario ristabilire le connessioni, il tunnel TLS, il contesto di autorizzazione SASL e le sessioni.If the underlying connection collapses, connections, TLS tunnel, SASL authorization context, and sessions must be reestablished.

AMQP trasferisce i messaggi sui collegamenti.AMQP transfers messages over links. Un collegamento è un percorso di comunicazione creato su una sessione che consente il trasferimento di messaggi in una direzione. La negoziazione dello stato del trasferimento viene effettuata sul collegamento ed è bidirezionale tra le parti connesse.A link is a communication path created over a session that enables transferring messages in one direction; the transfer status negotiation is over the link and bi-directional between the connected parties.

I collegamenti possono essere creati da uno dei contenitori in qualsiasi momento e su una sessione esistente. Ciò rende il protocollo AMQP diverso da molti altri protocolli, inclusi HTTP e MQTT, dove l'inizializzazione dei trasferimenti e il percorso di trasferimento sono un privilegio esclusivo della parte che crea la connessione socket.Links can be created by either container at any time and over an existing session, which makes AMQP different from many other protocols, including HTTP and MQTT, where the initiation of transfers and transfer path is an exclusive privilege of the party creating the socket connection.

Il contenitore che inizializza il collegamento chiede al contenitore opposto di accettare un collegamento e sceglie un ruolo di mittente o ricevitore.The link-initiating container asks the opposite container to accept a link and it chooses a role of either sender or receiver. Ogni contenitore può quindi inizializzare la creazione di percorsi di comunicazione unidirezionali o bidirezionali. I percorsi bidirezionali vengono modellati come coppie di collegamenti.Therefore, either container can initiate creating unidirectional or bi-directional communication paths, with the latter modeled as pairs of links.

I collegamenti sono denominati e sono associati ai nodi.Links are named and associated with nodes. Come indicato all'inizio, i nodi sono entità comunicanti all'interno di un contenitore.As stated in the beginning, nodes are the communicating entities inside a container.

Nel bus di servizio un nodo corrisponde direttamente a una coda, un argomento, una sottoscrizione o una coda secondaria di messaggi non recapitabili di una coda o una sottoscrizione.In Service Bus, a node is directly equivalent to a queue, a topic, a subscription, or a deadletter subqueue of a queue or subscription. Il nome del nodo usato in AMQP è quindi il nome relativo dell'entità all'interno dello spazio dei nomi del bus di servizio.The node name used in AMQP is therefore the relative name of the entity inside of the Service Bus namespace. Se una coda è denominata myqueue, tale nome corrisponde anche al nome del nodo AMQP.If a queue is named myqueue, that’s also its AMQP node name. Una sottoscrizione dell'argomento segue la convenzione dell'interfaccia API HTTP e viene ordinata in una raccolta di risorse "subscriptions". Pertanto una sottoscrizione sub o un argomento mytopic ha il nome di nodo AMQP mytopic/subscriptions/sub.A topic subscription follows the HTTP API convention by being sorted into a "subscriptions" resource collection and thus, a subscription sub or a topic mytopic has the AMQP node name mytopic/subscriptions/sub.

Il client che si connette deve anche usare un nome di nodo locale per la creazione di collegamenti. Il bus di servizio non fornisce prescrizioni specifiche sui nomi dei nodi e non li interpreta.The connecting client is also required to use a local node name for creating links; Service Bus is not prescriptive about those node names and does not interpret them. Gli stack del client AMQP 1.0 usano in genere uno schema per assicurare che i nomi di nodi temporanei siano univoci nell'ambito del client.AMQP 1.0 client stacks generally use a scheme to assure that these ephemeral node names are unique in the scope of the client.

TrasferimentiTransfers

Dopo la creazione di un collegamento, è possibile trasferire i messaggi su tale collegamento.Once a link has been established, messages can be transferred over that link. In AMQP un trasferimento viene eseguito con un gesto esplicito del protocollo, ovvero la performativa transfer, che sposta un messaggio dal mittente al ricevitore tramite un collegamento.In AMQP, a transfer is executed with an explicit protocol gesture (the transfer performative) that moves a message from sender to receiver over a link. Un trasferimento è completo quando è "finalizzato", ovvero quando entrambe le parti hanno raggiunto un accordo condiviso dell'esito del trasferimento.A transfer is complete when it is “settled”, meaning that both parties have established a shared understanding of the outcome of that transfer.

Nel caso più semplice il mittente può scegliere di inviare messaggi "pre-finalizzati", ovvero il client non è interessato all'esito e il ricevitore non fornisce alcun commento sull'esito dell'operazione.In the simplest case, the sender can choose to send messages "pre-settled," meaning that the client isn’t interested in the outcome and the receiver does not provide any feedback about the outcome of the operation. Questa modalità è supportata dal bus di servizio a livello del protocollo AMQP, ma non viene esposta in nessuna API client.This mode is supported by Service Bus at the AMQP protocol level, but not exposed in any of the client APIs.

La situazione normale prevede l'invio di messaggi non finalizzati. Il ricevitore indica quindi l'accettazione o il rifiuto usando la performativa disposition.The regular case is that messages are being sent unsettled, and the receiver then indicates acceptance or rejection using the disposition performative. Il rifiuto si verifica quando il ricevitore non può accettare il messaggio per qualsiasi motivo e il messaggio di rifiuto contiene informazioni sul motivo, ovvero una struttura di errore definita da AMQP.Rejection occurs when the receiver cannot accept the message for any reason, and the rejection message contains information about the reason, which is an error structure defined by AMQP. Se i messaggi vengono rifiutati a causa di errori interni nel bus di servizio, il servizio restituisce informazioni aggiuntive all'interno della struttura. Queste informazioni possono essere usate per offrire suggerimenti di diagnostica al personale di supporto tecnico in caso di invio di richieste di supporto.If messages are rejected due to internal errors inside of Service Bus, the service returns extra information inside that structure that can be used for providing diagnostics hints to support personnel if you are filing support requests. Informazioni dettagliate sugli errori sono disponibili più avanti.You'll learn more details about errors later.

Una forma speciale di rifiuto è costituita dallo stato released, che indica che il ricevitore non ha alcuna obiezione tecnica al trasferimento, ma non è al tempo stesso interessato alla finalizzazione del trasferimento.A special form of rejection is the released state, which indicates that the receiver has no technical objection to the transfer, but also no interest in settling the transfer. È ad esempio possibile che un messaggio venga recapitato a un client del bus di servizio e che il client scelga di "abbandonare" il messaggio perché non è in grado di eseguire le operazioni risultanti dall'elaborazione del messaggio stesso, anche se l'operazione di recapito non presenta errori.That case exists, for example, when a message is delivered to a Service Bus client, and the client chooses to "abandon" the message because it cannot perform the work resulting from processing the message; the message delivery itself is not at fault. Una variazione di questo stato è lo stato modified, che consente modifiche al messaggio durante il rilascio.A variation of that state is the modified state, which allows changes to the message as it is released. Questo stato non viene attualmente usato dal bus di servizio.That state is not used by Service Bus at present.

La specifica AMQP 1.0 definisce uno stato di disposizione aggiuntivo denominato received, che semplifica in modo specifico la gestione del recupero del collegamento.The AMQP 1.0 specification defines a further disposition state called received, that specifically helps to handle link recovery. Il recupero del collegamento consente di ricostituire lo stato di un collegamento e di eventuali recapiti in sospeso su una nuova connessione e sessione, in caso di perdita della connessione e della sessione precedente.Link recovery allows reconstituting the state of a link and any pending deliveries on top of a new connection and session, when the prior connection and session were lost.

Il bus di servizio non supporta il recupero del collegamento. Se il client perde la connessione al bus di servizio con un trasferimento di messaggio non finalizzato in sospeso, il trasferimento del messaggio va perso e il client deve riconnettersi, ristabilire il collegamento e riprovare il trasferimento.Service Bus does not support link recovery; if the client loses the connection to Service Bus with an unsettled message transfer pending, that message transfer is lost, and the client must reconnect, reestablish the link, and retry the transfer.

Il bus di servizio e gli hub eventi supportano quindi i trasferimenti di tipo "almeno una volta", in cui il mittente può essere sicuro che il messaggio è stato archiviato e accettato, ma non supportano i trasferimenti di tipo "esattamente una volta" a livello AMQP, in cui il sistema prova a recuperare il collegamento e continua a negoziare lo stato del recapito per evitare la duplicazione del trasferimento del messaggio.As such, Service Bus and Event Hubs support "at least once" transfers where the sender can be assured for the message having been stored and accepted, but do not support "exactly once" transfers at the AMQP level, where the system would attempt to recover the link and continue to negotiate the delivery state to avoid duplication of the message transfer.

Per compensare possibili invii duplicati, il bus di servizio supporta il rilevamento dei duplicati come funzionalità facoltativa nelle code e negli argomenti.To compensate for possible duplicate sends, Service Bus supports duplicate detection as an optional feature on queues and topics. Il rilevamento dei duplicati registra gli ID di tutti i messaggi in arrivo durante un intervallo di tempo definito dall'utente, quindi rilascia automaticamente tutti i messaggi inviati con gli stessi ID di messaggio durante lo stesso intervallo.Duplicate detection records the message IDs of all incoming messages during a user-defined time window, then silently drops all messages sent with the same message-IDs during that same window.

Controllo di flussoFlow control

Oltre al modello di controllo di flusso a livello di sessione illustrato in precedenza, ogni collegamento ha il proprio modello di controllo di flusso.In addition to the session-level flow control model that previously discussed, each link has its own flow control model. Il controllo di flusso a livello di sessione protegge il contenitore dalla necessità di gestire un numero eccessivo di frame alla volta. Il controllo di flusso a livello di collegamento assegna all'applicazione la responsabilità di specificare il numero di messaggi da gestire da un collegamento e del momento in cui gestirli.Session-level flow control protects the container from having to handle too many frames at once, link-level flow control puts the application in charge of how many messages it wants to handle from a link and when.

I trasferimenti su un collegamento possono essere eseguiti solo quando il mittente dispone di credito di collegamento sufficiente.On a link, transfers can only happen when the sender has enough link credit. Il credito di collegamento è un contatore impostato dal ricevitore usando la performativa flow, che ha come ambito un collegamento.Link credit is a counter set by the receiver using the flow performative, which is scoped to a link. Quando riceve credito di collegamento, il mittente prova a usare completamente tale credito recapitando messaggi.When the sender is assigned link credit, it attempts to use up that credit by delivering messages. Ogni recapito di messaggi riduce di 1 il credito di collegamento rimanente.Each message delivery decrements the remaining link credit by 1. Quando il credito di collegamento viene usato completamente, i recapiti si interrompono.When the link credit is used up, deliveries stop.

Quando il bus di servizio ha il ruolo di ricevitore, fornisce immediatamente al mittente un credito di collegamento molto ampio per consentire l'invio immediato dei messaggi.When Service Bus is in the receiver role, it instantly provides the sender with ample link credit, so that messages can be sent immediately. Durante l'uso del credito di collegamento, il bus di servizio invia di tanto in tanto una performativa flow al mittente per aggiornare il saldo del credito di collegamento.As link credit is used, Service Bus occasionally sends a flow performative to the sender to update the link credit balance.

Il bus di servizio con ruolo di mittente invia i messaggi in modo da usare completamente un eventuale credito di collegamento residuo.In the sender role, Service Bus sends messages to use up any outstanding link credit.

Una chiamata di "ricezione" a livello di API viene convertita in una performativa flow inviata al bus di servizio dal client e il bus di servizio usa tale credito selezionando il primo messaggio non bloccato disponibile dalla coda, bloccandolo e trasferendolo.A "receive" call at the API level translates into a flow performative being sent to Service Bus by the client, and Service Bus consumes that credit by taking the first available, unlocked message from the queue, locking it, and transferring it. Se non sono disponibili messaggi pronti per il recapito, un eventuale credito residuo da parte di un collegamento stabilito con quell'entità specifica rimane registrato in ordine di arrivo e i messaggi vengono bloccati e trasferiti non appena disponibili, in modo da usare l'eventuale credito residuo.If there is no message readily available for delivery, any outstanding credit by any link established with that particular entity remains recorded in order of arrival, and messages are locked and transferred as they become available, to use any outstanding credit.

Il blocco di un messaggio viene rilasciato quando il trasferimento viene finalizzato in uno degli stati terminali, ovvero accepted, rejected o released.The lock on a message is released when the transfer is settled into one of the terminal states accepted, rejected, or released. Il messaggio viene rimosso dal bus di servizio quando lo stato terminale è accepted.The message is removed from Service Bus when the terminal state is accepted. Il messaggio rimane nel bus di servizio e viene recapitato al ricevitore successivo quando il trasferimento raggiunge uno degli altri stati.It remains in Service Bus and is delivered to the next receiver when the transfer reaches any of the other states. Il bus di servizio sposta automaticamente il messaggio nella coda di messaggi non recapitabili dell'entità quando raggiunge il numero massimo di recapiti consentiti per l'entità a causa di rifiuti o rilasci ripetuti.Service Bus automatically moves the message into the entity's deadletter queue when it reaches the maximum delivery count allowed for the entity due to repeated rejections or releases.

Anche se attualmente le API del bus di servizio non presentano direttamente un'opzione di questo tipo, un client di protocollo AMQP di livello inferiore può usare il modello del credito di collegamento per trasformare l'interazione di "tipo pull" che emette un'unità di credito per ogni richiesta di ricezione in un modello di "tipo push", che emette un numero elevato di crediti di collegamento e quindi può ricevere i messaggi non appena disponibili e senza altre interazioni.Even though the Service Bus APIs do not directly expose such an option today, a lower-level AMQP protocol client can use the link-credit model to turn the "pull-style" interaction of issuing one unit of credit for each receive request into a "push-style" model by issuing a large number of link credits and then receive messages as they become available without any further interaction. La modalità push è supportata tramite le impostazioni delle proprietà MessagingFactory.PrefetchCount o MessageReceiver.PrefetchCount.Push is supported through the MessagingFactory.PrefetchCount or MessageReceiver.PrefetchCount property settings. Quando sono diverse da zero, il client AMQP le usa come credito di collegamento.When they are non-zero, the AMQP client uses it as the link credit.

In questo contesto è importante notare che il clock per la scadenza del blocco sul messaggio nell'entità viene avviato quando il messaggio viene accettato dall'entità e non all'inizio della fase di trasmissione.In this context, it's important to understand that the clock for the expiration of the lock on the message inside the entity starts when the message is taken from the entity, not when the message is put on the wire. Quando il client indica che è pronto per ricevere messaggi emettendo un credito di collegamento, si prevede quindi che esegua attivamente il pull dei messaggi sulla rete che sia pronto a gestirli.Whenever the client indicates readiness to receive messages by issuing link credit, it is therefore expected to be actively pulling messages across the network and be ready to handle them. In caso contrario, è possibile che il blocco del messaggio scada prima che il messaggio venga recapitato.Otherwise the message lock may have expired before the message is even delivered. L'uso del controllo di flusso del credito di collegamento deve riflettere in modo diretto la capacità immediata di gestire i messaggi disponibili inviati al ricevitore.The use of link-credit flow control should directly reflect the immediate readiness to deal with available messages dispatched to the receiver.

In breve, le sezioni seguenti forniscono una panoramica schematica del flusso performativo durante diverse interazioni con le API.In summary, the following sections provide a schematic overview of the performative flow during different API interactions. Ogni sezione descrive un'operazione logica diversa.Each section describes a different logical operation. Alcune interazioni possono essere "differite", ovvero essere eseguite solo quando richieste.Some of those interactions may be "lazy," meaning they may only be performed when required. La creazione di un mittente del messaggio potrebbe non provocare alcuna interazione di rete fino al primo invio o alla prima richiesta di messaggio.Creating a message sender may not cause a network interaction until the first message is sent or requested.

Le frecce della seguente tabella visualizzano la direzione del flusso performativo.The arrows in the following table show the performative flow direction.

Creare il ricevitore dei messaggiCreate message receiver

ClientClient BUS DI SERVIZIOService Bus
--> attach(--> attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=receiver,role=receiver,
source={nome entità},source={entity name},
target={ID collegamento client}target={client link id}
))
Il client si collega a un'entità come ricevitoreClient attaches to entity as receiver
Il bus di servizio risponde collegando la propria estremità del collegamentoService Bus replies attaching its end of the link <-- attach(<-- attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=sender,role=sender,
source={nome entità},source={entity name},
target={ID collegamento client}target={client link id}
))

Creare il mittente dei messaggiCreate message sender

ClientClient BUS DI SERVIZIOService Bus
--> attach(--> attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=sender,role=sender,
source={ID collegamento client},source={client link id},
target={nome entità}target={entity name}
))
Nessuna azioneNo action
Nessuna azioneNo action <-- attach(<-- attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=receiver,role=receiver,
source={ID collegamento client},source={client link id},
target={nome entità}target={entity name}
))

Creare il mittente dei messaggi (errore)Create message sender (error)

ClientClient BUS DI SERVIZIOService Bus
--> attach(--> attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=sender,role=sender,
source={ID collegamento client},source={client link id},
target={nome entità}target={entity name}
))
Nessuna azioneNo action
Nessuna azioneNo action <-- attach(<-- attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=receiver,role=receiver,
source=null,source=null,
target=nulltarget=null
))

<-- detach(<-- detach(
handle={handle numerico},handle={numeric handle},
closed=true,closed=true,
error={informazioni errore}error={error info}
))

Chiudere il ricevitore/mittente dei messaggiClose message receiver/sender

ClientClient BUS DI SERVIZIOService Bus
--> detach(--> detach(
handle={handle numerico},handle={numeric handle},
closed=trueclosed=true
))
Nessuna azioneNo action
Nessuna azioneNo action <-- detach(<-- detach(
handle={handle numerico},handle={numeric handle},
closed=trueclosed=true
))

Inviare (operazione riuscita)Send (success)

ClientClient BUS DI SERVIZIOService Bus
--> transfer(--> transfer(
delivery-id={handle numerico},delivery-id={numeric handle},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,,more=false,settled=false,,more=false,
state=null,state=null,
resume=falseresume=false
))
Nessuna azioneNo action
Nessuna azioneNo action <-- disposition(<-- disposition(
role=receiver,role=receiver,
first={ID consegna},first={delivery id},
last={ID consegna},last={delivery id},
settled=true,settled=true,
state=acceptedstate=accepted
))

Inviare (errore)Send (error)

ClientClient BUS DI SERVIZIOService Bus
--> transfer(--> transfer(
delivery-id={handle numerico},delivery-id={numeric handle},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,,more=false,settled=false,,more=false,
state=null,state=null,
resume=falseresume=false
))
Nessuna azioneNo action
Nessuna azioneNo action <-- disposition(<-- disposition(
role=receiver,role=receiver,
first={ID consegna},first={delivery id},
last={ID consegna},last={delivery id},
settled=true,settled=true,
state=rejected(state=rejected(
error={informazioni errore}error={error info}
))
))

RicevereReceive

ClientClient BUS DI SERVIZIOService Bus
--> flow(--> flow(
link-credit=1link-credit=1
))
Nessuna azioneNo action
Nessuna azioneNo action < transfer(< transfer(
delivery-id={handle numerico},delivery-id={numeric handle},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,settled=false,
more=false,more=false,
state=null,state=null,
resume=falseresume=false
))
--> disposition(--> disposition(
role=receiver,role=receiver,
first={ID consegna},first={delivery id},
last={ID consegna},last={delivery id},
settled=true,settled=true,
state=acceptedstate=accepted
))
Nessuna azioneNo action

Ricevere più messaggiMulti-message receive

ClientClient BUS DI SERVIZIOService Bus
--> flow(--> flow(
link-credit=3link-credit=3
))
Nessuna azioneNo action
Nessuna azioneNo action < transfer(< transfer(
delivery-id={handle numerico},delivery-id={numeric handle},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,settled=false,
more=false,more=false,
state=null,state=null,
resume=falseresume=false
))
Nessuna azioneNo action < transfer(< transfer(
delivery-id={hanlde numerico+1},delivery-id={numeric handle+1},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,settled=false,
more=false,more=false,
state=null,state=null,
resume=falseresume=false
))
Nessuna azioneNo action < transfer(< transfer(
delivery-id={handle numerico+2},delivery-id={numeric handle+2},
delivery-tag={handle binario},delivery-tag={binary handle},
settled=false,settled=false,
more=false,more=false,
state=null,state=null,
resume=falseresume=false
))
--> disposition(--> disposition(
role=receiver,role=receiver,
first={ID consegna},first={delivery id},
last={ID consegna+2},last={delivery id+2},
settled=true,settled=true,
state=acceptedstate=accepted
))
Nessuna azioneNo action

MessaggiMessages

Le sezioni seguenti spiegano quali proprietà delle sessioni di messaggi AMQP standard vengono usate dal bus di servizio e ne illustrano il mapping al set di API del bus di servizio.The following sections explain which properties from the standard AMQP message sections are used by Service Bus and how they map to the Service Bus API set.

Nome campoField Name UtilizzoUsage Nome APIAPI name
durabledurable - -
prioritypriority - -
ttlttl Durata di questo messaggioTime to live for this message TimeToLiveTimeToLive
first-acquirerfirst-acquirer - -
delivery-countdelivery-count - DeliveryCountDeliveryCount

propertiesproperties

Nome campoField Name UtilizzoUsage Nome APIAPI name
message-idmessage-id Identificatore freeform definito dall'applicazione per questo messaggio.Application-defined, free-form identifier for this message. Usato per il rilevamento dei duplicati.Used for duplicate detection. MessageIdMessageId
user-iduser-id Identificatore dell'utente definito dall'applicazione, non interpretato dal bus di servizio.Application-defined user identifier, not interpreted by Service Bus. Non è accessibile tramite l'API del bus di servizio.Not accessible through the Service Bus API.
toto Identificatore della destinazione definito dall'applicazione, non interpretato dal bus di servizio.Application-defined destination identifier, not interpreted by Service Bus. ToTo
subjectsubject Identificatore dello scopo del messaggio definito dall'applicazione, non interpretato dal bus di servizio.Application-defined message purpose identifier, not interpreted by Service Bus. LabelLabel
reply-toreply-to Indicatore del percorso di risposta definito dall'applicazione, non interpretato dal bus di servizio.Application-defined reply-path indicator, not interpreted by Service Bus. ReplyToReplyTo
correlation-idcorrelation-id Identificatore della correlazione definito dall'applicazione, non interpretato dal bus di servizio.Application-defined correlation identifier, not interpreted by Service Bus. CorrelationIdCorrelationId
content-typecontent-type Indicatore del tipo di contenuto definito dall'applicazione per il corpo, non interpretato dal bus di servizio.Application-defined content-type indicator for the body, not interpreted by Service Bus. ContentTypeContentType
content-encodingcontent-encoding Indicatore della codifica del contenuto definito dall'applicazione per il corpo, non interpretato dal bus di servizio.Application-defined content-encoding indicator for the body, not interpreted by Service Bus. Non è accessibile tramite l'API del bus di servizio.Not accessible through the Service Bus API.
absolute-expiry-timeabsolute-expiry-time Indica l'istante assoluto in cui scadrà il messaggio.Declares at which absolute instant the message expires. Viene ignorato nell'input (viene osservato il valore TTL dell'intestazione), viene considerato autorevole nell'output.Ignored on input (header TTL is observed), authoritative on output. ExpiresAtUtcExpiresAtUtc
creation-timecreation-time Dichiara l'ora di creazione del messaggio.Declares at which time the message was created. Non usato dal bus di servizioNot used by Service Bus Non è accessibile tramite l'API del bus di servizio.Not accessible through the Service Bus API.
group-idgroup-id Identificatore definito dall'applicazione per un set correlato di messaggi.Application-defined identifier for a related set of messages. Usato per le sessioni del bus di servizio.Used for Service Bus sessions. SessionIdSessionId
group-sequencegroup-sequence Contatore che identifica il numero di sequenza relativo al messaggio in una sessione.Counter identifying the relative sequence number of the message inside a session. Ignorato dal bus di servizio.Ignored by Service Bus. Non è accessibile tramite l'API del bus di servizio.Not accessible through the Service Bus API.
reply-to-group-idreply-to-group-id - ReplyToSessionIdReplyToSessionId

Funzionalità avanzate del bus di servizioAdvanced Service Bus capabilities

Questa sezione illustra le funzionalità avanzate del bus di servizio di Azure basate sulle estensioni provvisorie per AMQP attualmente in fase di sviluppo nel comitato tecnico OASIS per AMQP.This section covers advanced capabilities of Azure Service Bus that are based on draft extensions to AMQP, currently being developed in the OASIS Technical Committee for AMQP. Il bus di servizio implementa la versione più recente di queste estensioni provvisorie e adotta le modifiche introdotte non appena le versioni provvisorie acquisiscono lo stato standard.Service Bus implements the latest versions of these drafts and adopts changes introduced as those drafts reach standard status.

Nota

Le operazioni avanzate per la messaggistica del bus di servizio sono supportate tramite un modello di richiesta/risposta.Service Bus Messaging advanced operations are supported through a request/response pattern. I dettagli di queste operazioni sono descritti nell'articolo AMQP 1.0 in Service Bus: request/response-based operations (AMQP 1.0 nel bus di servizio: operazioni basate su richiesta/risposta).The details of these operations are described in the article AMQP 1.0 in Service Bus: request-response-based operations.

Gestione di AMQPAMQP management

La specifica di gestione di AMQP è la prima delle estensioni provvisorie illustrate in questo articolo.The AMQP management specification is the first of the draft extensions discussed in this article. Questa specifica definisce un set di protocolli posizionati sopra il protocollo AMQP che consentono interazioni di gestione con l'infrastruttura di messaggistica su AMQP.This specification defines a set of protocols layered on top of the AMQP protocol that allow management interactions with the messaging infrastructure over AMQP. La specifica definisce operazioni generiche, ad esempio create, read, update e delete per la gestione di entità all'interno di un'infrastruttura di messaggistica e di un set di operazioni di query.The specification defines generic operations such as create, read, update, and delete for managing entities inside a messaging infrastructure and a set of query operations.

Tutti questi gesti richiedono un'interazione di tipo richiesta/risposta tra il client e l'infrastruttura di messaggistica. Pertanto la specifica definisce come modellare tale schema di interazione su AMQP: il client si connette alla struttura di messaggistica, inizializza una sessione e quindi crea una coppia di collegamenti.All those gestures require a request/response interaction between the client and the messaging infrastructure, and therefore the specification defines how to model that interaction pattern on top of AMQP: the client connects to the messaging infrastructure, initiates a session, and then creates a pair of links. In un collegamento il client funge da mittente e nell'altro funge da ricevitore, creando quindi una coppia di collegamenti che può fungere da canale bidirezionale.On one link, the client acts as sender and on the other it acts as receiver, thus creating a pair of links that can act as a bi-directional channel.

Operazione logicaLogical Operation ClientClient Bus di servizioService Bus
Creare un percorso di richiesta/rispostaCreate Request Response Path --> attach(--> attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=sender,role=sender,
source=null,source=null,
target="myentity/$management"target=”myentity/$management”
))
Nessuna azioneNo action
Creare un percorso di richiesta/rispostaCreate Request Response Path Nessuna azioneNo action <-- attach(<-- attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=receiver,role=receiver,
source=null,source=null,
target="myentity"target=”myentity”
))
Creare un percorso di richiesta/rispostaCreate Request Response Path --> attach(--> attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=receiver,role=receiver,
source="myentity/$management",source=”myentity/$management”,
target="myclient$id"target=”myclient$id”
))
Creare un percorso di richiesta/rispostaCreate Request Response Path Nessuna azioneNo action <-- attach(<-- attach(
name={nome collegamento},name={link name},
handle={handle numerico},handle={numeric handle},
role=sender,role=sender,
source="myentity",source=”myentity”,
target="myclient$id"target=”myclient$id”
))

Se la coppia di collegamenti è disponibile, l'implementazione del percorso di richiesta/risposta è molto semplice: una richiesta è un messaggio inviato a un'entità all'interno dell'infrastruttura di messaggistica che comprende questo modello.Having that pair of links in place, the request/response implementation is straightforward: a request is a message sent to an entity inside the messaging infrastructure that understands this pattern. Nel messaggio di richiesta il campo reply-to nella sezione properties è impostato sull'identificatore target per il collegamento in cui recapitare la risposta.In that request-message, the reply-to field in the properties section is set to the target identifier for the link onto which to deliver the response. L'entità di gestione elabora la richiesta e recapita la risposta sul collegamento il cui identificatore target corrisponde all'identificatore reply-to indicato.The handling entity processes the request, and then delivers the reply over the link whose target identifier matches the indicated reply-to identifier.

Il modello richiede ovviamente che il contenitore client e l'identificatore generato dal client per la destinazione di risposta siano univoci in tutti i client e, per motivi di sicurezza, che siano anche difficili da prevedere.The pattern obviously requires that the client container and the client-generated identifier for the reply destination are unique across all clients and, for security reasons, also difficult to predict.

Gli scambi di messaggi usati per il protocollo di gestione e per tutti gli altri protocolli che usano lo stesso modello vengono eseguiti a livello di applicazione. Non definiscono nuovi gesti a livello di protocollo AMQP.The message exchanges used for the management protocol and for all other protocols that use the same pattern happen at the application level; they do not define new AMQP protocol-level gestures. Questo approccio è intenzionale e consente alle applicazioni di sfruttare immediatamente i vantaggi di queste estensioni con gli stack conformi ad AMQP 1.0.That's intentional, so that applications can take immediate advantage of these extensions with compliant AMQP 1.0 stacks.

Il bus di servizio non implementa attualmente alcuna funzionalità di base della specifica di gestione, ma il modello di richiesta/risposta definito dalla specifica di gestione è fondamentale per la funzionalità di sicurezza basata sulle attestazioni e per la maggior parte delle funzionalità avanzate che verranno illustrate nelle sezioni successive.Service Bus does not currently implement any of the core features of the management specification, but the request/response pattern defined by the management specification is foundational for the claims-based-security feature and for nearly all of the advanced capabilities discussed in the following sections.

Autorizzazione basata sulle attestazioniClaims-based authorization

La bozza di specifica dell'autorizzazione basata sulle attestazioni (CBS, Claims-Based-Authorization specification) di AMQP si basa sul modello richiesta/risposta della specifica di gestione e illustra un modello generalizzato per l'uso dei token di sicurezza federati con AMQP.The AMQP Claims-Based-Authorization (CBS) specification draft builds on the management specification request/response pattern, and describes a generalized model for how to use federated security tokens with AMQP.

Il modello di sicurezza predefinito di AMQP illustrato nell'introduzione è basato su SASL e si integra con l'handshake di connessione di AMQP.The default security model of AMQP discussed in the introduction is based on SASL and integrates with the AMQP connection handshake. L'uso di SASL risulta vantaggioso perché fornisce un modello estendibile per cui è stato definito un set di meccanismi, che possono risultare utili per qualsiasi protocollo che si basa formalmente su SASL.Using SASL has the advantage that it provides an extensible model for which a set of mechanisms have been defined from which any protocol that formally leans on SASL can benefit. Questi meccanismi includono ad esempio "PLAIN" per il trasferimento di nomi utente e password, "EXTERNAL" per l'associazione alla sicurezza a livello TLS, "ANONYMOUS" per indicare l'assenza di un'autenticazione/autorizzazione esplicita e una vasta gamma di meccanismi aggiuntivi che consentono il passaggio di credenziali di autenticazione e/o autorizzazione o token.Among those mechanisms are “PLAIN” for transfer of usernames and passwords, “EXTERNAL” to bind to TLS-level security, “ANONYMOUS” to express the absence of explicit authentication/authorization, and a broad variety of additional mechanisms that allow passing authentication and/or authorization credentials or tokens.

L'integrazione di AMQP con SASL presenta due svantaggi:AMQP’s SASL integration has two drawbacks:

  • Tutte le credenziali e i token hanno come ambito la connessione.All credentials and tokens are scoped to the connection. È possibile che in un'infrastruttura di messaggistica si desideri specificare un controllo di accesso differenziato in base alle singole entità. Ad esempio è possibile consentire al titolare di un token di inviare messaggi alla coda A ma non alla coda B. Se il contesto di autorizzazione è ancorato alla connessione, non è possibile usare una singola connessione e al tempo stesso usare token di accesso diversi per la coda A e la coda B.A messaging infrastructure may want to provide differentiated access control on a per-entity basis; for example, allowing the bearer of a token to send to queue A but not to queue B. With the authorization context anchored on the connection, it’s not possible to use a single connection and yet use different access tokens for queue A and queue B.
  • I token di accesso sono in genere validi solo per un periodo limitato di tempo.Access tokens are typically only valid for a limited time. L'utente dovrà quindi riacquisire periodicamente i token e l'autorità emittente dei token potrà rifiutare l'emissione di un nuovo token se le autorizzazioni di accesso dell'utente sono state modificate.This validity requires the user to periodically reacquire tokens and provides an opportunity to the token issuer to refuse issuing a fresh token if the user’s access permissions have changed. Le connessioni AMQP possono durare per periodi di tempo lunghi.AMQP connections may last for long periods of time. Il modello SASL consente solo di impostare un token in fase di connessione, ovvero l'infrastruttura di messaggistica deve disconnettere il client alla scadenza del token oppure deve accettare il rischio derivante dalla comunicazione continua con un client i cui diritti di accesso potrebbero essere stati revocati nel frattempo.The SASL model only provides a chance to set a token at connection time, which means that the messaging infrastructure either has to disconnect the client when the token expires or it needs to accept the risk of allowing continued communication with a client who’s access rights may have been revoked in the interim.

La specifica CBS per AMQP, implementata dal bus di servizio, offre una soluzione ideale entrambi i problemi: consente al client di associare token di accesso a ogni nodo e di aggiornare questi token prima della scadenza, senza interrompere il flusso di messaggi.The AMQP CBS specification, implemented by Service Bus, enables an elegant workaround for both of those issues: It allows a client to associate access tokens with each node, and to update those tokens before they expire, without interrupting the message flow.

CBS definisce un nodo di gestione virtuale, denominato $cbs, che deve essere specificato dall'infrastruttura di messaggistica.CBS defines a virtual management node, named $cbs, to be provided by the messaging infrastructure. Il nodo di gestione accetta i token per conto di qualsiasi altro nodo nell'infrastruttura di messaggistica.The management node accepts tokens on behalf of any other nodes in the messaging infrastructure.

Il gesto del protocollo è uno scambio di tipo richiesta/risposta, in base a quanto definito dalla specifica di gestione.The protocol gesture is a request/reply exchange as defined by the management specification. Ciò significa che il client stabilisce una coppia di collegamenti con il nodo $cbs, passa una richiesta al collegamento in uscita e infine attende la risposta sul collegamento in ingresso.That means the client establishes a pair of links with the $cbs node and then passes a request on the outbound link, and then waits for the response on the inbound link.

Ecco le proprietà dell'applicazione per il messaggio di richiesta:The request message has the following application properties:

ChiaveKey FacoltativoOptional Tipo di valoreValue Type Contenuti del valoreValue Contents
operationoperation NoNo stringstring put-tokenput-token
typetype NoNo stringstring Tipo di token inserito.The type of the token being put.
namename NoNo stringstring "Destinatari" a cui è applicabile il token.The "audience" to which the token applies.
expirationexpiration Yes timestamptimestamp Ora di scadenza del token.The expiry time of the token.

La proprietà name identifica l'entità a cui deve essere associato il token.The name property identifies the entity with which the token shall be associated. Nel bus di servizio corrisponde al percorso della coda o dell'argomento/sottoscrizione.In Service Bus it's the path to the queue, or topic/subscription. La proprietà type identifica il tipo di token:The type property identifies the token type:

Tipo di tokenToken Type Descrizione del tokenToken Description Tipo di corpoBody Type NoteNotes
amqp:jwtamqp:jwt Token Web JSON (JWT)JSON Web Token (JWT) Valore AMQP (stringa)AMQP Value (string) Non ancora disponibile.Not yet available.
amqp:swtamqp:swt Token Web semplice (SWT)Simple Web Token (SWT) Valore AMQP (stringa)AMQP Value (string) Supportato solo per token Web semplici emessi da AAD/ACSOnly supported for SWT tokens issued by AAD/ACS
servicebus.windows.net:sastokenservicebus.windows.net:sastoken Token SAS del bus di servizioService Bus SAS Token Valore AMQP (stringa)AMQP Value (string) -

I token conferiscono diritti.Tokens confer rights. Il bus di servizio riconosce tre diritti fondamentali: "Send" per consentire l'invio, "Listen" per consentire la ricezione e "Manage" per consentire la modifica delle entità.Service Bus knows about three fundamental rights: "Send" enables sending, "Listen" enables receiving, and "Manage" enables manipulating entities. I token Web semplici emessi da AAD/ACS includono esplicitamente questi diritti come attestazioni.SWT tokens issued by AAD/ACS explicitly include those rights as claims. I token di firma di accesso condiviso del bus di servizio fanno riferimento a regole configurate nello spazio dei nomi o nell'entità e queste regole sono configurate con diritti.Service Bus SAS tokens refer to rules configured on the namespace or entity, and those rules are configured with rights. Se si firma il token con la chiave associata a quella regola, il token esprimerà i rispettivi diritti.Signing the token with the key associated with that rule thus makes the token express the respective rights. Il token associato a un'entità che usa put-token consente al client connesso di interagire con l'entità in base ai diritti del token.The token associated with an entity using put-token permits the connected client to interact with the entity per the token rights. Un collegamento in cui il client ha il ruolo sender richiede il diritto "Send", mentre per il ruolo receiver richiede il diritto "Listen".A link where the client takes on the sender role requires the "Send" right; taking on the receiver role requires the "Listen" right.

Il messaggio di risposta ha i valori application-properties seguenti:The reply message has the following application-properties values

ChiaveKey FacoltativoOptional Tipo di valoreValue Type Contenuti del valoreValue Contents
status-codestatus-code NoNo intint Codice di risposta HTTP [RFC2616].HTTP response code [RFC2616].
status-descriptionstatus-description Yes stringstring Descrizione dello stato.Description of the status.

Il client può chiamare put-token ripetutamente e per qualsiasi entità nell'infrastruttura di messaggistica.The client can call put-token repeatedly and for any entity in the messaging infrastructure. I token hanno come ambito il client corrente e sono ancorati alla connessione corrente, quindi il server elimina eventuali token conservati al termine della connessione.The tokens are scoped to the current client and anchored on the current connection, meaning the server drops any retained tokens when the connection drops.

L'implementazione corrente del bus di servizio consente CBS solo insieme al metodo "ANONYMOUS" di SASL.The current Service Bus implementation only allows CBS in conjunction with the SASL method "ANONYMOUS." Una connessione SSL/TLS deve sempre esistere prima dell'handshake SASL.A SSL/TLS connection must always exist prior to the SASL handshake.

Il meccanismo ANONYMOUS deve quindi essere supportato dal client AMQP 1.0 scelto.The ANONYMOUS mechanism must therefore be supported by the chosen AMQP 1.0 client. Per accesso anonimo si intende che l'handshake di connessione iniziale, inclusa la creazione della sessione iniziale, viene eseguito senza che il bus di servizio sappia chi sta creando la connessione.Anonymous access means that the initial connection handshake, including creating of the initial session happens without Service Bus knowing who is creating the connection.

Dopo aver stabilito la connessione e la sessione, le uniche operazioni consentite sono l'associazione dei collegamenti al nodo $cbs e l'invio della richiesta put-token.Once the connection and session is established, attaching the links to the $cbs node and sending the put-token request are the only permitted operations. Un token valido deve essere impostato correttamente usando una richiesta put-token per un nodo di entità entro 20 secondi dall'avvio della connessione. In caso contrario, la connessione viene interrotta unilateralmente dal bus di servizio.A valid token must be set successfully using a put-token request for some entity node within 20 seconds after the connection has been established, otherwise the connection is unilaterally dropped by Service Bus.

Il client è successivamente responsabile della verifica della scadenza del token.The client is subsequently responsible for keeping track of token expiration. Alla scadenza di un token il bus di servizio elimina immediatamente tutti i collegamenti alla rispettiva entità nella connessione.When a token expires, Service Bus promptly drops all links on the connection to the respective entity. Per evitare questo problema, il client può sostituire il token per il nodo con un nuovo token in qualsiasi momento tramite il nodo di gestione virtuale $cbs con lo stesso gesto put-token e senza ostacolare il traffico di payload tra i diversi collegamenti.To prevent this, the client can replace the token for the node with a new one at any time through the virtual $cbs management node with the same put-token gesture, and without getting in the way of the payload traffic that flows on different links.

Passaggi successiviNext steps

Per altre informazioni su AMQP, visitare i collegamenti seguenti:To learn more about AMQP, visit the following links: