Arquitetar uma solução usando o Azure

Concluído

A criação de uma arquitetura de aplicativo exige que você compreenda a amplitude dos requisitos funcionais e não funcionais e combine esses requisitos com ferramentas, tecnologias e serviços que possam atendê-los.

No cenário de uso de ônibus, há alguns requisitos principais:

  • Um site para monitorar a localização dos ônibus em tempo real
  • Notificações que avisam quando um ônibus está próximo
  • Implantação e dimensionamento automatizados

Vamos nos aprofundar nesse cenário e em como você pode arquitetar uma solução usando vários serviços do Azure.

Recuperar os dados do ônibus em tempo real

Muitas cidades fornecem dados sobre o transporte público por meio da GTFS (Especificação Geral de Feed de Trânsito), que também dá suporte a um feed em tempo real conhecido como GTFS-RT v2 (Referência da GTFS em Tempo Real v2). O feed é composto por um documento JSON semelhante ao seguinte exemplo (do feed do 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
      }
    },

Uma vez que esse feed está disponível, a próxima etapa é descobrir como ser notificado quando o ônibus estiver perto o suficiente para você se dirigir ao ponto a fim de pegá-lo no horário correto. Para fazer isso, podemos criar uma cerca geográfica de algumas paradas de ônibus anteriores ao ponto de ônibus desejado. Dessa forma, você pode ser notificado quando o ônibus está entrando ou saindo da cerca geográfica. Se você receber uma notificação quando isso acontecer, não precisará ficar acompanhando a localização do ônibus no mapa. Quando você receber a notificação, saberá que é a hora de sair.

Arquitetar uma solução com os serviços do Azure

Considerando o cenário e a solução ideal, aqui está uma arquitetura possível:

Diagrama da arquitetura de microsserviços de uso de ônibus.

A arquitetura usa vários serviços diferentes para minimizar a quantidade de código que você precisa escrever e aproveitar ao máximo os benefícios de escalabilidade e infraestrutura oferecidos pelo Azure.

Texto Bem Conhecido (WKT) é uma linguagem de marcação de texto sem formatação para representar locais de geometria vetorial em um mapa. WKT é um padrão de OGC (Open Geospatial Consortium) usado para representar dados espaciais em um formato textual. A maioria dos sistemas compatíveis com OGC dá suporte a Texto Bem Conhecido.

Aqui, você terá uma visão geral sobre os componentes da solução selecionados e o motivo dessa seleção. Depois, neste módulo, o foco será o serviço de banco de dados.

Armazenar e processar dados com o Banco de Dados SQL do Azure

O Banco de Dados SQL do Azure é uma ótima opção para esse cenário. Vamos entender o motivo.

O Banco de Dados SQL do Azure tem suporte nativo para JSON, o que ajuda a reduzir a quantidade de código necessária para manipular os dados enviados e recebidos com o banco de dados. Isso também torna a solução mais ágil e fácil de ser aprimorada, graças à natureza flexível do JSON. Além disso, garante eficiência ao passar matrizes de dados ao SQL do Azure e permite otimizar as viagens de ida e volta e reduzir a latência.

O SQL do Azure também oferece suporte geoespacial completo: um ótimo recurso, já que manipular dados geoespaciais não é uma tarefa fácil. Ao contar com um mecanismo geoespacial completo dentro do banco de dados, evita-se a complexidade da integração com bibliotecas externas. Você também não precisa mover dados para descobrir, por exemplo, se um ônibus está dentro de uma cerca geográfica definida. Como o SQL do Azure opera dentro dos padrões do Open Geospatial Consortium, é fácil integrar os dados armazenados no SQL do Azure com bibliotecas de visualização como a OpenLayers.

Os recursos mencionados acima são desenvolvidos com as bases sólidas do modelo relacional, que foi aprimorado ao longo de anos para atender aos requisitos dos aplicativos modernos. O Banco de Dados SQL do Azure pode ser ampliado até 100 TB com o nível Hiperescala, o que significa que você pode usá-lo para aplicativos com uso intensivo de armazenamento (por exemplo, bancos de dados grandes). O Banco de Dados SQL do Azure também é econômico quando você usa o nível Sem Servidor, que dá suporte ao dimensionamento automático e ao recurso "pausar e retomar". O SQL do Azure também dá suporte a índices columnstore para consultas analíticas extremamente rápidas, a modelos do Graph para simplificar o gerenciamento de relações entre objetos complexos e a um otimizador de consulta de última geração que é aprimorado continuamente e pode lidar com as cargas de trabalho mais exigentes, como aquelas dos jogos online atuais com a participação intensiva de vários jogadores.

Com o SQL do Azure também é fácil acessar dados estáticos, como as informações de rota fornecidas pelo padrão GTFS, que podem ser armazenadas em uma conta do Armazenamento de Blobs do Azure. Podemos usar a função OPENROWSET no SQL do Azure para importar dados de um arquivo de texto sem a necessidade de outro serviço. Isso nos permite minimizar a complexidade da solução.

Por esses motivos, o Banco de Dados SQL do Azure é uma ótima opção para aplicativos como esse de uso de ônibus, no qual você usa dados JSON e geoespaciais, mas também quer aproveitar as funcionalidades de acesso a dados e de procedimento incorporadas no mecanismo. A opção sem servidor do Banco de Dados SQL do Azure é ótima para atender ao requisito de dimensionamento automático, permitindo que o aplicativo lide com horários de alta demanda durante o dia, em que mais pessoas estão tentando pegar o ônibus. O Banco de Dados SQL do Azure também dá suporte a tecnologias de CI/CD (integração contínua e entrega contínua/implantação contínua), como o Azure DevOps e o GitHub Actions, o que simplifica a automação da implantação.

Criar um serviço de API com o Azure Functions

Você precisa de uma API para acessar e consumir o feed da GTFS, a fim de notificar o usuário quando o ônibus entra em uma cerca geográfica definida e fornecer dados a um aplicativo Web. Você selecionou o Azure Functions como o serviço preferencial devido à simplicidade e à arquitetura sem servidor que ele oferece. O Azure Functions é um excelente serviço, pois sua natureza sem servidor é dimensionada automaticamente para aquilo que você precisa, deixando quase todos os aspectos de infraestrutura para o Azure Functions. O Azure Functions dá suporte a diferentes linguagens, permitindo que você escolha a sua preferida ou a mais adequada para a tarefa em questão, seguindo uma abordagem pura de microsserviços.

Enviar notificações por push com os Aplicativos Lógicos do Azure

Para obter a notificação de que o ônibus está entrando na sua cerca geográfica e você precisa caminhar até o ponto, uma opção no Azure é usar os Aplicativos Lógicos do Azure. Os Aplicativos Lógicos do Azure têm muitos conectores para que você possa se integrar a outros serviços. Por exemplo, você pode usar os Aplicativos Lógicos do Azure para enviar uma mensagem SMS ou um email da sua conta do Outlook ou do Gmail. O melhor dos Aplicativos Lógicos do Azure é que essa plataforma exige pouco ou nenhum código, de modo que a configuração do serviço de notificação de uso de ônibus é simples e pode ser feita com apenas algumas interações visuais.

Hospedar o aplicativo Web com os Aplicativos Web Estáticos do Azure

Para visualizar os dados geoespaciais que representam as cercas geográficas e as posições do ônibus no mapa, você pode criar uma página HTML estática usando o tão conhecido jQuery e as bibliotecas OpenLayers. A página estática precisa obter os dados de uma API REST no lado do servidor, que serão fornecidos por outra Função do Azure. Como o cliente e o back-end também são necessários para que a página de visualização funcione, você pode usufruir dos Aplicativos Web Estáticos do Azure. Os Aplicativos Web Estáticos do Azure facilitam o desenvolvimento e a implantação da solução, pois combinam as funcionalidades dos Aplicativos Web do Azure e do Azure Functions, além de serem integrados internamente ao GitHub Actions.

Implantação automatizada com o GitHub Actions

Como você já viu, a solução completa é composta por várias partes dinâmicas: o serviço de back-end para efetuar pull de dados do feed em tempo real, o banco de dados para armazenar, processar e fornecer os dados e a solução de visualização de front-end que é composta por um arquivo HTML estático e um ponto de extremidade da API REST. Usando um pipeline de CI/CD por meio do GitHub Actions, você automatiza a implantação de todas as partes por meio do GitHub e do Visual Studio Code sempre que faz commit das alterações. As alterações que existirem no banco de dados, juntamente com as alterações no Azure Functions e nos Aplicativos Web Estáticos do Azure, serão implantadas de maneira totalmente automatizada e orquestrada.