Progettare una soluzione con Azure

Completato

Per creare un'architettura per l'applicazione è necessario comprendere la portata dei requisiti funzionali e non funzionali e quindi associare tali requisiti a strumenti, tecnologie e servizi in grado di soddisfarli.

Nello scenario in cui un utente deve prendere un autobus ecco alcuni requisiti principali:

  • Un sito Web per il monitoraggio della posizione dell'autobus in tempo reale
  • Notifiche quando un autobus si avvicina
  • Distribuzione e ridimensionamento automatizzati

Verrà ora illustrato in dettaglio questo scenario e come è possibile creare una soluzione usando vari servizi di Azure.

Recuperare i dati relativi all'autobus in tempo reale

In molte città i dati sui trasporti pubblici vengono trasmessi tramite GTFS (General Transit Feed Specification), che supporta anche un feed in tempo reale noto come GTFS real-time Reference v2 (GTFS-RT). Il feed è costituito da un documento JSON simile all'esempio seguente (dal feed di King County Metro):

{
      "id": "1618418866_4318",
      "vehicle": {
        "trip": {
          "trip_id": "49195161",
          "direction_id": 0,
          "route_id": "100001",
          "start_date": "20210414",
          "schedule_relationship": "SCHEDULED"
        },
        "vehicle": {
          "id": "4318",
          "label": "4318"
        },
        "position": {
          "latitude": 47.64524,
          "longitude": -122.370171
        },
        "current_stop_sequence": 228,
        "stop_id": "2010",
        "current_status": "IN_TRANSIT_TO",
        "timestamp": 1618418841
      }
    },

Sapendo che è disponibile un feed di questo tipo, è necessario capire come ricevere una notifica quando un autobus è abbastanza vicino, in modo da iniziare a incamminarsi verso la stazione degli autobus per prendere l'autobus in tempo. A tale scopo, è possibile creare un recinto virtuale un paio di fermate di autobus prima della stazione prevista. In questo modo, è possibile ricevere una notifica quando il bus sta entrando nel recinto virtuale o uscendo da esso. Se si riceve la notifica, non è necessario continuare a controllare la mappa per vedere dove si trova l'autobus. L'utente sa che è il momento di uscire quando riceve la notifica.

Progettare una soluzione con i servizi di Azure

In base allo scenario e alla soluzione ideale, ecco una possibile architettura:

Diagramma dell'architettura dei microservizi per il monitoraggio degli autobus.

L'architettura usa diversi servizi per ridurre al minimo la quantità di codice da scrivere e per sfruttare il più possibile i vantaggi della scalabilità e dell'infrastruttura offerti da Azure.

WKT (Well-Known Text) è un linguaggio di markup in testo normale per la rappresentazione di posizioni di geometria vettoriale su una mappa. WKT è uno standard OGC (Open Geospatial Consortium) usato per rappresentare i dati spaziali in un formato testuale. La maggior parte dei sistemi conformi a OGC supporta WKT (Well-Known Text).

Ecco una panoramica dei componenti della soluzione e del motivo per cui vengono selezionati. Successivamente, il modulo illustrerà il servizio di database.

Archiviare ed elaborare i dati con database SQL di Azure

Database SQL di Azure è ideale per questo scenario. Ecco perché.

Il database SQL di Azure include il supporto JSON nativo, che consente di ridurre la quantità di codice necessario per modificare i dati inviati e ricevuti con il database. Grazie alla natura flessibile del formato JSON consente di migliorare la soluzione in modo agile e semplice. Garantisce anche il passaggio in modo efficiente di matrici di dati ad Azure SQL, l'ottimizzazione dei round trip e la riduzione della latenza.

Azure SQL offre anche supporto geospaziale completo, una caratteristica molto utile, perché la modifica dei dati geospaziali non è un'attività semplice. Grazie a un motore geospaziale completo all'interno del database, è possibile evitare la complessità dell'integrazione con librerie esterne. Non è neanche necessario spostare i dati per capire, ad esempio, se un autobus si trova all'interno di un recinto virtuale definito. Dal momento che Azure SQL rispetta gli standard dell'Open Geospatial Consortium, è facile integrare i dati archiviati in Azure SQL con librerie di visualizzazione come OpenLayers.

Le funzionalità menzionate sopra si basano sulle fondamenta solide del modello relazionale, sviluppate attraverso anni di miglioramento per soddisfare i requisiti delle applicazioni moderne. Il Database SQL di Azure è scalabile fino a 100 TB con il livello Hyperscale, ovvero è possibile usarlo per applicazioni a elevato utilizzo di archiviazione, ad esempio database di grandi dimensioni. Il Database SQL di Azure è anche conveniente quando si usa il livello Serverless, che supporta la scalabilità automatica e la sospensione e la ripresa. Azure SQL supporta anche gli indici columnstore per eseguire query analitiche veloci, modelli di grafo per semplificare la gestione delle relazioni di oggetti complessi e un Query Optimizer all'avanguardia in continuo miglioramento e in grado di gestire anche il carico di lavoro più impegnativo, come quello richiesto dagli attuali, pesanti giochi online multiplayer.

Con Azure SQL è anche facile accedere ai dati statici, come le informazioni sul percorso disponibili grazie allo standard GTFS, che è possibile archiviare in un account di Archiviazione BLOB di Azure. È possibile usare la funzione OPENROWSET in Azure SQL per importare dati da un file di testo senza la necessità di un altro servizio. Ciò consente di ridurre al minimo la complessità della soluzione.

Per questi motivi, Database SQL di Azure è ideale per applicazioni come l'app di monitoraggio degli autobus, in cui si gestiscono dati JSON e geospaziali, ma si vuole anche sfruttare le capacità procedurali e di accesso integrate nel motore. Database SQL di Azure serverless è un'ottima opzione per soddisfare il requisito di scalabilità automatica, consentendo all'applicazione di gestire gli orari di punta giornalieri in cui più persone tentano di prendere l'autobus. Il database SQL di Azure supporta anche tecnologie di integrazione continua e recapito continuo/distribuzione continua (CI/CD), come Azure DevOps e GitHub Actions, che semplificano l'automazione della distribuzione.

Creare un servizio API con Funzioni di Azure

È necessaria un'API per accedere al feed GTFS e utilizzarlo per inviare una notifica a un utente se un bus è entrato in un recinto virtuale e per fornire i dati in un'applicazione Web. Si è selezionato Funzioni di Azure come servizio preferito in virtù della sua semplicità e dell'architettura serverless. Funzioni di Azure è un ottimo servizio perché la sua natura serverless consente di applicare la scalabilità automatica in base alle esigenze, lasciando quasi tutti gli aspetti infrastrutturali a Funzioni di Azure. Funzioni di Azure supporta linguaggi diversi, quindi è possibile scegliere quello che si preferisce o che è più adatto all'attività a cui si sta lavorando, adottando così un approccio puro ai microservizi.

Inviare notifiche con App per la logica di Azure

Un'opzione disponibile in Azure per ricevere una notifica che comunica che un autobus si trova all'interno del recinto virtuale e che è necessario incamminarsi verso la stazione consiste nell'usare App per la logica di Azure. App per la logica di Azure dispone di un numero elevato di connettori per poterla integrare con altri servizi. Ad esempio, è possibile usare App per la logica di Azure per inviare un SMS o un messaggio di posta elettronica dal proprio account Outlook o Gmail. L'aspetto interessante di App per la logica di Azure è che si tratta di una piattaforma con poco codice/nessun codice, quindi la configurazione del servizio di notifica per intercettare il bus è semplice e può essere eseguita con poche azioni del mouse.

Ospitare un'applicazione Web con App Web statiche di Azure

Per visualizzare i dati geospaziali, che rappresentano i recinti virtuali e le posizioni dell'autobus su una mappa, è possibile creare una pagina HTML statica usando il noto jQuery e la libreria OpenLayers. La pagina statica dovrà recuperare i dati da un'API REST lato server resa disponibile da un'altra funzione di Azure. Poiché per il funzionamento della pagina di visualizzazione servono sia le parti client che back-end, è possibile sfruttare i vantaggi di App Web statiche di Azure. App Web statiche di Azure semplifica lo sviluppo e la distribuzione della soluzione, perché combina le funzionalità di App Web di Azure e Funzioni di Azure e integra in modo predefinito GitHub Actions.

Automatizzare la distribuzione con GitHub Actions

Come si è visto, la soluzione completa è costituita da diverse parti mobili: il servizio back-end per eseguire il pull dei dati dal feed in tempo reale, il database per archiviare, elaborare e fornire i dati e la soluzione di visualizzazione front-end, costituita da un file HTML statico e un endpoint dell'API REST. Usando una pipeline CI/CD tramite GitHub Actions, si automatizza la distribuzione di tutti i componenti, tramite GitHub e Visual Studio Code, ogni volta che si esegue il commit delle modifiche. Le eventuali modifiche al database, insieme alle modifiche di Funzioni di Azure e App Web statiche di Azure, verranno distribuite in modo completamente automatizzato e orchestrato.

Verifica delle conoscenze

1.

In questo scenario quale servizio di database deve essere usato per archiviare, elaborare e gestire i dati degli autobus in tempo reale?

2.

Un formato di file standard aperto comune che verrà usato per ricevere i dati IoT dai veicoli di transito in questo scenario è:

3.

Quale livello di servizio o funzionalità del database SQL di Azure supporta uno scenario in cui è necessario un database da 12 TB?