Scegliere una distribuzione basata su messaggi con code
Si supponga di dover pianificare l'architettura di un'applicazione per la condivisione di musica. È necessario assicurarsi che i file musicali vengano caricati nell'API Web in modo affidabile dall'app per dispositivi mobili. I dettagli relativi ai nuovi brani devono essere inviati direttamente all'app quando un artista aggiunge una nuova musica alla raccolta. Questo è lo scenario ideale per un sistema basato su messaggi e Azure offre due soluzioni per questo problema:
- Archiviazione code di Azure
- Bus di servizio di Azure
Che cos'è Archiviazione code di Azure?
Archiviazione code è un servizio che usa Archiviazione di Azure per archiviare grandi quantità di messaggi accessibili in modo sicuro ovunque nel mondo usando una semplice interfaccia basata su REST. Le code possono contenere milioni di messaggi, limitati solo dalla capacità dell'account di archiviazione che ne è proprietario.
Che cosa sono le code del bus di servizio di Azure?
Il bus di servizio è un sistema broker di messaggi destinato alle applicazioni aziendali. Queste app spesso utilizzano più protocolli di comunicazione, hanno contratti di dati diversi, requisiti di sicurezza più elevati e possono includere servizi sia cloud che locali. Il bus di servizio si basa su un'infrastruttura di messaggistica dedicata, progettata specificamente per questi scenari.
Entrambi i servizi si basano sul concetto di coda, che contiene i messaggi inviati in attesa che la destinazione sia pronta a riceverli.
Che cosa sono gli argomenti del bus di servizio di Azure?
Gli argomenti del bus di servizio di Azure sono come le code ma, a differenza di queste, hanno più sottoscrittori. Quando un messaggio viene inviato a un argomento anziché a una coda, è possibile che più di un componente venga attivato per svolgere il proprio lavoro. Si supponga che un utente stia ascoltando un brano in un'applicazione di condivisione di musica. e che l'app per dispositivi mobili invii un messaggio all'argomento "In ascolto". Questo argomento avrà una sottoscrizione per "UpdateUserListenHistory" e una sottoscrizione diversa per "UpdateArtistsFanList". Ognuna di queste funzioni viene gestita da un componente diverso che riceve la propria copia del messaggio.
Internamente, gli argomenti usano le code. Quando si pubblica un post in un argomento, il messaggio viene copiato e rilasciato nella coda relativa ad ogni sottoscrizione. In questo modo, la copia del messaggio rimane in attesa di essere elaborata da ogni ramo della sottoscrizione anche se il componente che deve elaborare la sottoscrizione è troppo occupato per gestirla.
Vantaggi delle code
Le infrastrutture delle code possono supportare numerose funzionalità avanzate che le rendono molto utili nei modi seguenti:
Una maggiore affidabilità
Le code vengono usate dalle applicazioni distribuite come posizioni di archiviazione temporanee per i messaggi in attesa di recapito a un componente di destinazione. Il componente di origine può aggiungere un messaggio alla coda e i componenti di destinazione possono recuperare il messaggio all'inizio della coda per elaborarlo. Le code migliorano l'affidabilità dello scambio di messaggi perché, nei momenti di picco, i messaggi possono attendere semplicemente fino a quando un componente di destinazione è pronto per elaborarli.
Garanzie di recapito dei messaggi
I sistemi di accodamento in genere garantiscono il recapito di ogni messaggio nella coda a un componente di destinazione. Per queste garanzie si possono adottare tuttavia approcci diversi:
Recapito At-Least-Once: questo approccio garantisce il recapito di ogni messaggio ad almeno uno dei componenti che recuperano i messaggi dalla coda. Si noti, tuttavia, che in determinate circostanze, è possibile che lo stesso messaggio venga recapitato più di una volta. Ad esempio, se sono presenti due istanze di un'app Web che recuperano i messaggi da una coda, in genere ogni messaggio viene recapitato a una sola di tali istanze. Tuttavia, se un'istanza richiede molto tempo per elaborare il messaggio e scade un timeout, il messaggio potrebbe essere inviato anche all'altra istanza. Il codice dell'app Web deve essere progettato tenendo in considerazione questa eventualità.
Recapito At-Most-Once: con questo approccio il recapito di ogni messaggio non è garantito, ed esiste anche una minima probabilità che il messaggio non arrivi. Tuttavia, a differenza del recapito At-Least-Once, non vi è alcuna possibilità che il messaggio venga recapitato due volte. In questo caso talvolta si parla di rilevamento duplicati automatico.
First-In-First-Out (FIFO): nella maggior parte dei sistemi di messaggistica i messaggi lasciano generalmente la coda nello stesso ordine in cui sono stati aggiunti, ma è necessario considerare se il recapito è garantito. Se l'applicazione distribuita richiede che i messaggi vengano elaborati con precisione nell'ordine corretto, è necessario scegliere un sistema di coda che include una garanzia FIFO.
Supporto transazionale
Alcuni gruppi di messaggi strettamente correlati possono causare problemi quando si verifica un errore di recapito per un messaggio nel gruppo.
Si consideri, ad esempio, un'applicazione di e-commerce. Quando un utente seleziona il pulsante Acquista, è possibile che venga generata una serie di messaggi e inviata a diverse destinazioni di elaborazione:
- Un messaggio con i dettagli dell'ordine viene inviato a un centro di evasione degli ordini
- Un messaggio con i dettagli di pagamento e il totale viene inviato a un sistema di elaborazione di carte di credito
- Un messaggio con le informazioni sulla ricevuta viene inviato a un database per generare una fattura per il cliente
In questo caso si vuole essere certi che vengano elaborati tutti i messaggi oppure nessuno. Non si resterà in affari a lungo se il messaggio relativo alla carta di credito non viene recapitato e tutti gli ordini vengono evasi senza pagamento. È possibile evitare questi tipi di problemi raggruppando i due messaggi in una transazione. Le transazioni contenenti i messaggi hanno esito positivo o negativo come singola unità, esattamente come nei database. Se il recapito del messaggio dei dettagli della carta di credito non riesce, anche il messaggio dei dettagli dell'ordine non verrà recapitato.
Qual è il servizio da scegliere?
Dopo aver stabilito che la strategia di comunicazione per questa architettura deve essere un messaggio, è necessario scegliere se usare le code di archiviazione di Azure o il bus di servizio di Azure. È possibile usare entrambe le tecnologie per archiviare e inviare i messaggi tra i componenti. Ogni tecnologia presenta un set di funzionalità leggermente diverso ed è quindi possibile scegliere l'una o l'altra, o entrambe, a seconda del problema da risolvere.
Usare le code del bus di servizio se:
- È necessaria una garanzia di recapito At-Most-Once.
- È necessaria una garanzia FIFO.
- È necessario raggruppare i messaggi in transazioni.
- Si vogliono ricevere i messaggi senza eseguire il polling della coda.
- È necessario fornire alle code un modello di accesso basato sui ruoli.
- È necessario gestire messaggi di dimensioni superiori a 64 KB, ma inferiori a 100 MB. Le dimensioni massime dei messaggi supportate dal livello standard sono 256 KB e il livello premium è pari a 100 MB.
- Le dimensioni della coda non supereranno 1 TB. La dimensione massima della coda per il livello standard è 80 GB e per il livello premium è 1 TB.
- Si vuole poter pubblicare e usare batch di messaggi.
Usare gli argomenti del bus di servizio se:
- Sono necessarie tutte le funzionalità fornite dalle code del bus di servizio. Inoltre, implementa un modello pub-sub in cui i messaggi possono essere instradati a una delle più sottoscrizioni, ognuna con i propri ricevitori indipendenti
L'archiviazione code non ha altrettante funzionalità, ma se tali funzionalità non sono necessarie, può essere una scelta più semplice. È inoltre la soluzione migliore se l'app presenta uno qualsiasi dei requisiti seguenti.
Scegliere l'archiviazione code se:
- È necessario un audit trail di tutti i messaggi che passano attraverso la coda.
- Si prevede che le dimensioni della coda possano superare 1 TB.
- Si vuole tenere traccia dello stato dell'elaborazione di un messaggio all'interno della coda.
Una coda è una semplice posizione di archiviazione temporanea per i messaggi inviati tra i componenti di un'applicazione distribuita. Usare una coda per organizzare i messaggi e gestire correttamente i picchi nella domanda non prevedibili.
Usare le code di archiviazione quando si vuole un sistema di accodamento semplice e facile da programmare. Per esigenze più avanzate, usare le code del bus di servizio. Se per un singolo messaggio sono presenti più destinazioni, ma è necessario un comportamento simile a quello delle code, usare gli argomenti del bus di servizio.