Bus di servizio di AzureAzure Service Bus

Indipendentemente dal fatto che sia eseguito nel cloud o in locale, spesso è necessario che un'applicazione o un servizio interagisca con altre applicazioni o servizi.Whether an application or service runs in the cloud or on premises, it often needs to interact with other applications or services. Per semplificare questa operazione, in Microsoft Azure è disponibile il bus di servizio.To provide a broadly useful way to do this, Microsoft Azure offers Service Bus. Questo articolo illustra questa tecnologia, descrivendo di che cosa si tratta e perché potrebbe essere necessario usarla.This article looks at this technology, describing what it is and why you might want to use it.

Dati fondamentali del bus di servizioService Bus fundamentals

A seconda delle situazioni, possono essere necessari stili di comunicazione diversi.Different situations call for different styles of communication. Talvolta, consentire alle applicazioni di inviare e ricevere messaggi attraverso una semplice coda è la soluzione migliore.Sometimes, letting applications send and receive messages through a simple queue is the best solution. In altre situazioni, una coda ordinaria non è sufficiente e l'uso di una coda con un meccanismo di pubblicazione e sottoscrizione risulta la soluzione più adatta.In other situations, an ordinary queue isn't enough; a queue with a publish-and-subscribe mechanism is better. In alcuni casi, è sufficiente una connessione tra applicazioni e le code non sono necessarie.In some cases, all that's needed is a connection between applications, and queues are not required. Il bus di servizio offre tutte e tre le opzioni e permette alle applicazioni di interagire in diversi modi.Service Bus provides all three options, enabling your applications to interact in several different ways.

Il bus di servizio è un servizio cloud multi-tenant, il che significa che il servizio è condiviso da più utenti.Service Bus is a multi-tenant cloud service, which means that the service is shared by multiple users. Ogni utente, ad esempio uno sviluppatore di applicazioni, crea uno spazio dei nomi e quindi definisce i meccanismi di comunicazione necessari all'interno di tale spazio dei nomi.Each user, such as an application developer, creates a namespace, then defines the communication mechanisms needed within that namespace. La Figura 1 mostra l'aspetto di questa architettura.Figure 1 shows how this architecture looks.

Figura 1: il bus di servizio offre un servizio multi-tenant per la connessione di applicazioni attraverso il cloud.Figure 1: Service Bus provides a multi-tenant service for connecting applications through the cloud.

All'interno di uno spazio dei nomi è possibile utilizzare una o più istanze di tre meccanismi di comunicazione diversi, ognuno dei quali consente di connettere le applicazioni in modo diverso.Within a namespace, you can use one or more instances of three different communication mechanisms, each of which connects applications in a different way. Le opzioni disponibili sono:The choices are:

  • Code: consentono la comunicazione unidirezionale.Queues, which allow one-directional communication. Ogni coda funge da intermediario (talvolta è infatti denominata broker) che archivia i messaggi inviati fino a quando non vengono ricevuti.Each queue acts as an intermediary (sometimes called a broker) that stores sent messages until they are received. Ogni messaggio viene ricevuto da un singolo destinatario.Each message is received by a single recipient.
  • Argomenti: garantiscono la comunicazione unidirezionale mediante sottoscrizioni. Un singolo argomento può avere più sottoscrizioni.Topics, which provide one-directional communication using subscriptions-a single topic can have multiple subscriptions. Come la coda, un argomento funge da broker ma ogni sottoscrizione può facoltativamente usare un filtro per ricevere solo messaggi corrispondenti a criteri specifici.Like a queue, a topic acts as a broker, but each subscription can optionally use a filter to receive only messages that match specific criteria.
  • Inoltri: forniscono funzionalità di comunicazione bidirezionale.Relays, which provide bi-directional communication. Diversamente da code e argomenti, un inoltro non archivia i messaggi in elaborazione, perché non si tratta di un broker.Unlike queues and topics, a relay doesn't store in-flight messages; it's not a broker. Al contrario, li passa semplicemente all'applicazione di destinazione.Instead, it just passes them on to the destination application.

Quando si crea una coda, un argomento o un inoltro, occorre assegnargli un nome.When you create a queue, topic, or relay, you give it a name. Questo nome, associato a quello assegnato allo spazio dei nomi, costituisce un identificatore univoco per l'oggetto.Combined with whatever you called your namespace, this name creates a unique identifier for the object. Le applicazioni possono fornire questo nome al bus di servizio e quindi usare tale coda, argomento o inoltro per comunicare tra loro.Applications can provide this name to Service Bus, then use that queue, topic, or relay to communicate with one another.

In uno scenario di inoltro le applicazioni Windows possono usare questi oggetti tramite Windows Communication Foundation (WCF).To use any of these objects in the relay scenario, Windows applications can use Windows Communication Foundation (WCF). Questo servizio è noto come inoltro WCF.This service is known as WCF Relay. Per le code e gli argomenti, le applicazioni Windows possono usare API del sistema di messaggistica definite dal bus di servizio.For queues and topics, Windows applications can use Service Bus-defined messaging APIs. Per rendere questi oggetti più semplici da usare da applicazioni non Windows, Microsoft fornisce SDK per Java, Node.js e altri linguaggi.To make these objects easier to use from non-Windows applications, Microsoft provides SDKs for Java, Node.js, and other languages. È anche possibile accedere a code e argomenti tramite le API REST su HTTP.You can also access queues and topics using REST APIs over HTTP(s).

È importante comprendere che, sebbene il bus di servizio stesso sia in esecuzione nel cloud, ovvero nei data center di Microsoft Azure, le applicazioni che lo usano possono essere eseguite ovunque.It's important to understand that even though Service Bus itself runs in the cloud (that is, in Microsoft's Azure datacenters), applications that use it can run anywhere. È possibile usare il bus di servizio per connettere applicazioni in esecuzione in Azure o all'interno del proprio data center.You can use Service Bus to connect applications running on Azure, for example, or applications running inside your own datacenter. È inoltre possibile usarlo per connettere un'applicazione in esecuzione in Azure o in un'altra piattaforma cloud a un'applicazione locale o a tablet e telefoni.You can also use it to connect an application running on Azure or another cloud platform with an on-premises application or with tablets and phones. È altresì possibile connettere elettrodomestici, sensori e altri dispositivi a un'applicazione centrale o gli uni agli altri.It's even possible to connect household appliances, sensors, and other devices to a central application or to one other. Il bus di servizio è un meccanismo di comunicazione nel cloud accessibile praticamente ovunque.Service Bus is a communication mechanism in the cloud that's accessible from pretty much anywhere. Il modo in cui lo si usa dipende dalle operazioni che le applicazioni devono eseguire.How you use it depends on what your applications need to do.

CodeQueues

Si supponga di dover connettere due applicazioni usando una coda del bus di servizio.Suppose you decide to connect two applications using a Service Bus queue. Nella figura 2 è illustrato questo scenario.Figure 2 illustrates this situation.

Figura 2: le code del bus di servizio forniscono un servizio di accodamento asincrono unidirezionale.Figure 2: Service Bus queues provide one-way asynchronous queuing.

Il processo è semplice: un mittente invia un messaggio a una coda del bus di servizio e un ricevitore lo preleva un momento successivo.The process is simple: A sender sends a message to a Service Bus queue, and a receiver picks up that message at some later time. Una coda può avere un singolo ricevitore, come illustrato nella Figura 2,A queue can have just a single receiver, as Figure 2 shows. oppure più applicazioni possono leggere dalla stessa coda.Or, multiple applications can read from the same queue. In quest'ultimo caso, ogni messaggio viene letto da un solo ricevitore.In the latter situation, each message is read by just one receiver. Per un servizio multicast è invece consigliabile usare un argomento.For a multi-cast service, you should use a topic instead.

Ogni messaggio è costituito da due parti: un set di proprietà, ognuno costituito da una coppia chiave-valore, e un payload dei messaggi.Each message has two parts: a set of properties, each a key/value pair, and a message payload. Il payload può essere di tipo binario, testo o anche XML.The payload can be binary, text, or even XML. Il modo in cui vengono usati dipende dall'operazione che l'applicazione sta tentando di eseguire.How they're used depends on what an application is trying to do. Ad esempio, un'applicazione che invia un messaggio relativo a una vendita recente, potrebbe includere le proprietà Seller="Ava" e Amount=10000.For example, an application sending a message about a recent sale might include the properties Seller="Ava" and Amount=10000. Il corpo del messaggio potrebbe contenere un'immagine digitalizzata del contratto di vendita firmato oppure, se questo non è disponibile, rimanere vuoto.The message body might contain a scanned image of the sale's signed contract or, if there isn't one, remain empty.

Un ricevitore può leggere un messaggio da una coda del bus di servizio in due modi.A receiver can read a message from a Service Bus queue in two different ways. La prima opzione, denominata ReceiveAndDelete, riceve un messaggio dalla coda e lo elimina immediatamente.The first option, called ReceiveAndDelete, receives a message from the queue and immediately deletes it. Questa opzione è semplice, ma se il ricevitore si arresta in modo anomalo prima di aver terminato l'elaborazione del messaggio, il messaggio andrà perso.This option is simple, but if the receiver crashes before it finishes processing the message, the message is lost. Poiché è stato rimosso dalla coda, nessun altro ricevitore potrà accedervi.Because it's been removed from the queue, no other receiver can access it.

La seconda opzione, PeekLock, consente di risolvere il problema.The second option, PeekLock, is meant to help with this problem. Come ReceiveAndDelete, anche la modalità di lettura PeekLock rimuove un messaggio dalla coda,Like ReceiveAndDelete, a PeekLock read removes a message from the queue. ma non lo elimina.It doesn't delete the message, however. Il messaggio viene invece bloccato e quindi reso invisibile agli altri utenti e rimane in attesa di uno dei tre eventi seguenti:Instead, it locks the message, making it invisible to other receivers, then waits for one of three events:

  • Se il ricevitore elabora correttamente il messaggio, chiama il metodo Complete() e la coda elimina il messaggio.If the receiver processes the message successfully, it calls Complete(), and the queue deletes the message.
  • Se il ricevitore stabilisce che non è possibile elaborare il messaggio, chiama il metodo Abandon().If the receiver decides that it can't process the message successfully, it calls Abandon(). La coda rimuove quindi il blocco dal messaggio e lo rende disponibile per gli altri ricevitori.The queue then removes the lock from the message and makes it available to other receivers.
  • Se il ricevitore non chiama uno di questi metodi entro un periodo di tempo configurabile (per impostazione predefinita, 60 secondi), la coda presuppone che si sia verificato un errore nel ricevitore.If the receiver calls neither of these methods within a configurable period of time (by default, 60 seconds), the queue assumes the receiver has failed. In questo caso si comporta come se il ricevitore avesse chiamato il metodo Abandon, rendendo così il messaggio disponibile per altri ricevitori.In this case, it behaves as if the receiver had called Abandon, making the message available to other receivers.

Possibili risultati: lo stesso messaggio potrebbe essere recapitato due volte, anche a due ricevitori diversi.Notice what can happen here: the same message might be delivered twice, perhaps to two different receivers. Le applicazioni che usano le code del bus di servizio devono prevedere questa eventualità.Applications using Service Bus queues must be prepared for this event. Per semplificare il rilevamento dei duplicati, ogni messaggio ha una proprietà MessageID univoca che per impostazione predefinita rimane invariata indipendentemente dal numero di letture del messaggio da una coda.To make duplicate detection easier, each message has a unique MessageID property that by default stays the same no matter how many times the message is read from a queue.

Le code risultano utili in un numero limitato di situazioni.Queues are useful in quite a few situations. Permettono alle applicazioni di comunicare anche se non sono in esecuzione contemporaneamente, sono quindi ideali per l'uso con applicazioni batch e mobili.They enable applications to communicate even when both aren't running at the same time, something that's especially handy with batch and mobile applications. Una coda con più ricevitori garantisce inoltre il bilanciamento del carico automatico, in quanto i messaggi vengono distribuiti tra i vari ricevitori.A queue with multiple receivers also provides automatic load balancing, since sent messages are spread across these receivers.

ArgomentiTopics

Sebbene siano utili, non sempre le code rappresentano la soluzione più appropriata.Useful as they are, queues aren't always the right solution. Talvolta, sono più indicati gli argomenti del bus di servizio.Sometimes, Service Bus topics are better. Nella figura 3 viene illustrato questo concetto.Figure 3 illustrates this idea.

Figura 3: in base al filtro specificato dall'applicazione di sottoscrizione, è possibile che vengano ricevuti alcuni o tutti i messaggi inviati a un argomento del bus di servizio.Figure 3: Based on the filter a subscribing application specifies, it can receive some or all the messages sent to a Service Bus topic.

Un argomento e una coda presentano caratteristiche simili.A topic is similar in many ways to a queue. I mittenti inviano messaggi a un argomento nello stesso modo in cui li inviano a una coda e tali messaggi hanno lo stesso aspetto di quelli nelle code.Senders submit messages to a topic in the same way that they submit messages to a queue, and those messages look the same as with queues. La differenza sta nel fatto che gli argomenti permettono a ogni applicazione ricevente di creare la propria sottoscrizione con la definizione di un filtro.The difference is that topics enable each receiving application to create its own subscription by defining a filter. Un sottoscrittore può quindi visualizzare solo i messaggi corrispondenti al filtro definito.A subscriber then sees only the messages that match that filter. Nella figura 3, ad esempio, sono mostrati un mittente e un argomento con tre sottoscrittori, ognuno con il relativo filtro:For example, Figure 3 shows a sender and a topic with three subscribers, each with its own filter:

  • Il sottoscrittore 1 riceve solo i messaggi che contengono la proprietà Venditore="Ava".Subscriber 1 receives only messages that contain the property Seller="Ava".
  • Il sottoscrittore 2 riceve i messaggi che contengono la proprietà Seller="Ruby" e/o che contengono una proprietà Amount il cui valore è maggiore di 100.000.Subscriber 2 receives messages that contain the property Seller="Ruby" and/or contain an Amount property whose value is greater than 100,000. Ruby potrebbe essere una responsabile vendite che vuole visualizzare sia le proprie vendite che le vendite di importo elevato, indipendentemente da chi le abbia concluse.Perhaps Ruby is the sales manager, so she wants to see both her own sales and all large sales regardless of who makes them.
  • Il sottoscrittore 3 presenta un filtro impostato su Truee pertanto riceve tutti i messaggi.Subscriber 3 has set its filter to True, which means that it receives all messages. Questa applicazione potrebbe ad esempio essere responsabile del mantenimento di un audit trail, pertanto è necessario che possa visualizzare tutti i messaggi.For example, this application might be responsible for maintaining an audit trail and therefore it needs to see all the messages.

Come con le code, i sottoscrittori di un argomento possono leggere i messaggi usando la modalità di ricezione ReceiveAndDelete o PeekLock.As with queues, subscribers to a topic can read messages using either ReceiveAndDelete or PeekLock. A differenza delle code, tuttavia, un singolo messaggio inviato a un argomento può essere ricevuto da più sottoscrizioni.Unlike queues, however, a single message sent to a topic can be received by multiple subscriptions. Questo approccio, comunemente denominato di pubblicazione e sottoscrizione o pub/sub, risulta utile qualora più applicazioni siano interessate agli stessi messaggi.This approach, commonly called publish and subscribe (or pub/sub), is useful whenever multiple applications are interested in the same messages. Con la definizione del filtro corretto, ogni sottoscrittore può accedere solo alla parte del flusso dei messaggi che gli interessa.By defining the right filter, each subscriber can tap into just the part of the message stream that it needs to see.

InoltriRelays

Le code e gli argomenti consentono la comunicazione asincrona unidirezionale tramite un broker.Both queues and topics provide one-way asynchronous communication through a broker. Il traffico scorre in una sola direzione e non esiste una connessione diretta tra mittenti e ricevitori.Traffic flows in just one direction, and there's no direct connection between senders and receivers. Talvolta questo potrebbe non essere sufficiente, ad esempioBut what if you don't want this connection? se è necessario che le applicazioni possano inviare e ricevere messaggi o se occorre un collegamento diretto tra esse e non serve che i messaggi vengano archiviati tramite un broker.Suppose your applications need to both send and receive messages, or perhaps you want a direct link between them and you don't need a broker to store messages. In questi scenari nel bus di servizio sono disponibili gli inoltri, come illustrato nella figura 4.To address scenarios such as this, Service Bus provides relays, as Figure 4 shows.

Figura 4: l'inoltro del bus di servizio garantisce la comunicazione sincrona bidirezionale tra applicazioni.Figure 4: Service Bus relay provides synchronous, two-way communication between applications.

La domanda più ovvia relativa all'uso degli inoltri è: perché è necessario usarli?The obvious question to ask about relays is this: why would I use one? Anche se le code non sono necessarie, perché le applicazioni dovrebbero comunicare tramite un servizio cloud anziché interagire direttamente?Even if I don't need queues, why make applications communicate via a cloud service rather than just interact directly? La risposta è che la comunicazione diretta tra le applicazioni potrebbe risultare più complessa di quanto si pensi.The answer is that talking directly can be harder than you might think.

Ad esempio, potrebbe essere necessario connettere due applicazioni locali, entrambe in esecuzione all'interno di data center aziendali.Suppose you want to connect two on-premises applications, both running inside corporate datacenters. Ognuna di queste applicazioni è protetta da firewall ed è probabile che ogni data center usi il processo NAT (Network Address Translation).Each of these applications sits behind a firewall, and each datacenter probably uses network address translation (NAT). Il firewall blocca i dati in ingresso su tutte le porte tranne alcune e il processo NAT implica che il computer in cui è in esecuzione ogni applicazione non disponga di un indirizzo IP fisso raggiungibile direttamente dall'esterno del data center.The firewall blocks incoming data on all but a few ports, and NAT implies that the machine each application is running on doesn't have a fixed IP address that you can reach directly from outside the datacenter. Senza un ulteriore supporto, la connessione di queste applicazioni sulla rete Internet pubblica risulta problematica.Without some extra help, connecting these applications over the public internet is problematic.

L'inoltro del bus di servizio di Azure può risultare utile.A Service Bus relay can help. Per comunicare in modalità bidirezionale tramite un inoltro, ogni applicazione stabilisce una connessione TCP in uscita con il bus di servizio e la mantiene aperta.To communicate bi-directionally through a relay, each application establishes an outbound TCP connection with Service Bus, then keeps it open. Tutte le comunicazioni tra le due applicazioni avvengono su tali connessioni.All communication between the two applications travels over these connections. Dato che ogni connessione è stata stabilita dall'interno del data center, il firewall consente il traffico in ingresso a ogni applicazione senza aprire nuove porte.Because each connection was established from inside the datacenter, the firewall allows incoming traffic to each application without opening new ports. Questo approccio consente inoltre di risolvere il problema relativo al processo NAT, in quanto ogni applicazione presenta un endpoint coerente nel cloud nel corso della comunicazione.This approach also gets around the NAT problem, because each application has a consistent endpoint in the cloud throughout the communication. Lo scambio di dati tramite l'inoltro consente alle applicazioni di evitare i problemi che potrebbero rendere difficoltosa la comunicazione.By exchanging data through the relay, the applications can avoid the problems that would otherwise make communication difficult.

Per usare l'inoltro del bus di servizio, le applicazioni usano Windows Communication Foundation (WCF).To use Service Bus relays, applications rely on the Windows Communication Foundation (WCF). Il bus di servizio fornisce le associazioni WCF che semplificano l'interazione delle applicazioni Windows tramite inoltro.Service Bus provides WCF bindings that make it straightforward for Windows applications to interact via relays. Le applicazioni che usano già WCF possono in genere specificare una di queste associazioni e quindi comunicare tra loro tramite un inoltro.Applications that already use WCF can typically specify one of these bindings, then talk to each other through a relay. Diversamente da code e argomenti, l'uso degli inoltri da applicazioni non Windows, anche se possibile, richiede alcune operazioni di programmazione dato che non sono disponibili librerie standard.Unlike queues and topics, however, using relays from non-Windows applications, while possible, requires some programming effort; no standard libraries are provided.

Diversamente da code e argomenti, le applicazioni non creano inoltri in modo esplicito.Unlike queues and topics, applications don't explicitly create relays. Al contrario, quando un'applicazione che desidera ricevere messaggi stabilisce una connessione TCP con il bus di servizio, l'inoltro viene creato automaticamente.Instead, when an application that wishes to receive messages establishes a TCP connection with Service Bus, a relay is created automatically. Quando la connessione viene chiusa, l'inoltro viene eliminato.When the connection is dropped, the relay is deleted. Per consentire a un'applicazione di trovare l'inoltro creato da un listener specifico, il bus di servizio fornisce un registro che permette alle applicazioni di trovare un inoltro specifico in base al nome.To enable an application to find the relay created by a specific listener, Service Bus provides a registry that enables applications to locate a specific relay by name.

Gli inoltri rappresentano la soluzione ottimale nei casi in cui è necessaria la comunicazione diretta tra applicazioni,Relays are the right solution when you need direct communication between applications. ad esempio un sistema di prenotazione di una compagnia aerea in esecuzione in un data center locale al quale devono poter accedere banchi del check-in, dispositivi mobili e altri computer.For example, consider an airline reservation system running in an on-premises datacenter that must be accessed from check-in kiosks, mobile devices, and other computers. Le applicazioni in esecuzione in tutti questi sistemi possono usare l'inoltro del bus di servizio nel cloud per comunicare, indipendentemente dalla posizione in cui risiedono.Applications running on all these systems could rely on Service Bus relays in the cloud to communicate, wherever they might be running.

RiepilogoSummary

La connessione tra applicazioni è sempre stata parte integrante dello sviluppo di soluzioni complete e il numero di scenari che richiedono una comunicazione diretta tra servizi e applicazioni è in costante aumento, di pari passo con il numero di applicazioni e dispositivi connessi a Internet.Connecting applications has always been part of building complete solutions, and the range of scenarios that require applications and services to communicate with each other is set to increase as more applications and devices are connected to the internet. Il bus di servizio include tecnologie basate sul cloud per la comunicazione tramite code, argomenti e inoltri, che consentono di rendere questa funzionalità essenziale più semplice da implementare e disponibile a livello più ampio.By providing cloud-based technologies for achieving communication through queues, topics, and relays, Service Bus aims to make this essential function easier to implement and more broadly available.

Passaggi successiviNext steps

A questo punto, dopo aver appreso le nozioni di base del bus di servizio di Azure, usare i seguenti collegamenti per altre informazioni.Now that you've learned the fundamentals of Azure Service Bus, follow these links to learn more.