Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I componenti principali di questa architettura sono un front-end Web che gestisce le richieste client e un ruolo di lavoro che esegue attività a elevato utilizzo di risorse, flussi di lavoro a esecuzione prolungata o processi batch. Il web front-end comunica con il worker tramite una coda di messaggi.
I componenti seguenti sono comunemente incorporati in questa architettura:
Uno o più database
Cache in cui archiviare i valori del database per letture rapide
Una rete per la distribuzione di contenuti per la gestione di contenuti statici
Servizi remoti, ad esempio posta elettronica o SMS (Short Message Service), che in genere forniscono provider di servizi non Microsoft
Fornitore di servizi di identità per l'autenticazione
Web e worker sono entrambi senza stato e lo stato della sessione può essere archiviato in una cache distribuita. Il lavoratore gestisce il lavoro a esecuzione prolungata in modo asincrono. I messaggi nella coda possono avviare il worker oppure una pianificazione può eseguirlo per l'elaborazione batch. Il compito del lavoratore è facoltativo se l'applicazione non dispone di operazioni a esecuzione prolungata.
Il front-end potrebbe includere un'API Web. Un'applicazione a pagina singola può utilizzare l'API Web effettuando chiamate AJAX o un'applicazione client nativa può utilizzarla direttamente.
Quando usare questa architettura
L'architettura Web-Queue-Worker viene in genere implementata usando servizi di calcolo gestiti come il servizio app di Azure o il servizio Azure Kubernetes.
Si consideri questa architettura per i casi d'uso seguenti:
Applicazioni con un dominio relativamente semplice
Applicazioni con flussi di lavoro a esecuzione prolungata o operazioni batch
Scenari in cui si preferisce i servizi gestiti rispetto all'infrastruttura distribuita come servizio (IaaS)
Vantaggi
Un'architettura semplice e semplice da seguire
Distribuzione e gestione con un minimo sforzo
Separazione chiara delle responsabilità
Disaccoppiamento del front-end e del lavoratore tramite la messaggistica asincrona
Scalabilità indipendente del front-end e del ruolo di lavoro
Sfide
Senza un'attenta progettazione, il front-end e il worker possono diventare componenti monolitici di grandi dimensioni, difficili da gestire e aggiornare.
Se il front-end e il ruolo di lavoro condividono schemi di dati o moduli di codice, potrebbero esserci dipendenze nascoste.
Il front-end web può fallire dopo essere stato persistito nel database ma prima di inviare messaggi alla coda, causando problemi di coerenza perché il worker non svolge la propria parte della logica. Per attenuare questo problema, è possibile utilizzare tecniche come il modello Outbox transazionale, che richiedono il reinoltro dei messaggi in uscita affinché ritornino tramite una coda separata. La libreria di sessioni transazionali NServiceBus supporta questa tecnica.
Procedure consigliate
Esporre un'API ben progettata al client. Per altre informazioni, vedere Procedure consigliate per la progettazione delle API.
Ridimensionamento automatico per gestire le variazioni nel carico. Per altre informazioni, vedere Procedure consigliate per la scalabilità automatica.
Memorizzare nella cache dati semistatici. Per altre informazioni, vedere Procedure consigliate per la memorizzazione nella cache.
Usare una rete per la distribuzione di contenuti per ospitare contenuto statico. Per altre informazioni, vedere Procedure consigliate per la rete per la distribuzione di contenuti.
Usare la persistenza poliglotta dei dati quando necessario. Per altre informazioni, vedere Informazioni sui modelli di dati.
Partizionare i dati per migliorare la scalabilità, ridurre i conflitti e ottimizzare le prestazioni. Per altre informazioni, vedere Procedure consigliate per il partizionamento dei dati.
Web-Queue-Worker nel servizio app
Questa sezione descrive un'architettura Web-Queue-Worker consigliata che utilizza App Service.
Scaricare un file di Visio di questa architettura.
Flusso di lavoro
Il front-end viene implementato come app Web di App Service e il worker viene implementato come app di Azure Functions. L'app Web e l'app delle Funzioni sono entrambe associate a un piano di servizio app che fornisce le istanze di macchine virtuali (VM).
È possibile usare il bus di servizio di Azure o le code di Archiviazione di Azure per la coda dei messaggi. Il diagramma precedente usa una coda di archiviazione.
Azure Managed Redis archivia lo stato della sessione e altri dati che richiedono l'accesso a bassa latenza.
La rete per la distribuzione di contenuti di Azure viene usata per memorizzare nella cache contenuto statico come immagini, CSS o HTML.
Per l'archiviazione, scegliere le tecnologie più adatte alle esigenze dell'applicazione. Questo approccio, noto come persistenza poliglotta, usa più tecnologie di archiviazione nello stesso sistema per soddisfare requisiti diversi. Per illustrare questa idea, il diagramma mostra sia il database SQL di Azure che Azure Cosmos DB.
Per ulteriori informazioni, vedere Baseline applicazione web ad alta disponibilità con ridondanza delle zone e Costruzione di applicazioni aziendali basate su messaggi con NServiceBus e Service Bus.
Altre considerazioni
Non tutte le transazioni devono passare attraverso la coda e il processo di lavoro per la memorizzazione. Il front-end Web può eseguire operazioni di lettura e scrittura semplici direttamente. I lavoratori sono progettati per attività che richiedono molte risorse o flussi di lavoro di lunga durata. In alcuni casi, potresti non aver bisogno di un lavoratore.
Usare la funzionalità di scalabilità automatica predefinita della piattaforma di calcolo per aumentare il numero di istanze. Se il carico nell'applicazione segue modelli prevedibili, usare la scalabilità automatica basata su pianificazione. Se il carico è imprevedibile, usare la scalabilità automatica basata su metriche.
Prendere in considerazione l'inserimento dell'app Web e dell'app Funzioni in piani di servizio App Service separati per consentire loro di scalare in modo indipendente.
Usare piani di servizio app separati per la produzione e i test.
Usare gli slot di implementazione per gestire le implementazioni. Questo metodo consente di distribuire una versione aggiornata in uno slot di staging e quindi di passare alla nuova versione. Consente anche di tornare alla versione precedente se si verifica un problema durante l'aggiornamento.