Diseño de una solución con Azure
Para crear la arquitectura de una aplicación debe comprender los distintos requisitos funcionales y no funcionales, y después emparejar esos requisitos con herramientas, tecnologías y servicios que puedan materializarlos.
En el escenario de transporte en autobús, hay algunos requisitos principales:
- Un sitio web para supervisar las ubicaciones del autobús en tiempo real
- Notificaciones de la cercanía de un autobús
- Implementación y escalado automáticos
Ahora se profundizará en este escenario y en cómo diseñar una solución mediante varios servicios de Azure.
Recuperación de datos de autobús en tiempo real
Muchas ciudades proporcionan datos de transporte público por medio de la Especificación general de fuentes de tránsito (GTFS), que también admite una fuente en tiempo real denominada GTFS real-time Reference v2 (GTFS-RT). La fuente se compone de un documento JSON similar al ejemplo siguiente (de la fuente 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
}
},
Al saber que esa fuente está disponible, después debe averiguar cómo recibir una notificación cuando un autobús está lo suficientemente cerca para saber cuándo empezar a dirigirse a la estación para llegar a tiempo. Para ello, se puede crear una geovalla con un par de paradas de autobús antes de la estación prevista. De este modo, se le puede notificar cuando el autobús entra o sale de la geovalla. Si puede recibir una notificación cuando esto sucede, ni siquiera tiene que seguir comprobando la posición del autobús en un mapa. Cuando reciba la notificación, sabrá que es el momento de salir.
Diseño de una solución con servicios de Azure
En función del escenario y la solución ideal, esta es una arquitectura posible:
En la arquitectura se usan varios servicios diferentes para minimizar la cantidad de código que debe escribir y aprovechar las posibles ventajas de escalabilidad e infraestructura que proporciona Azure.
Texto conocido (WKT) es un lenguaje de marcado de texto sin formato para representar ubicaciones de geometría vectorial en un mapa. WKT es un estándar de Open Geospatial Consortium (OGC) que se utiliza para representar datos espaciales en formato de texto. La mayoría de los sistemas compatibles con OGC admiten texto conocido.
Aquí, encontrará información general sobre qué componentes de la solución se han seleccionado y por qué. Después, en este módulo, se centrará en el servicio de base de datos.
Almacenamiento y proceso de datos con Azure SQL Database
Azure SQL Database es una excelente opción para este escenario. Ahora se verá por qué.
Azure SQL Database admite JSON de forma nativa, lo que ayuda a reducir la cantidad de código necesario para manipular los datos enviados y recibidos con la base de datos. También hace que la solución sea más ágil y fácil de mejorar gracias a la naturaleza flexible de JSON. Además se asegura de que puede pasar matrices de datos a Azure SQL de forma eficaz, optimizar los recorridos de ida y vuelta, y reducir la latencia.
Azure SQL también proporciona compatibilidad completa con datos geoespaciales, lo que es una excelente característica, ya que la manipulación de datos geoespaciales no es una tarea sencilla. Al tener un motor geoespacial completo dentro de la base de datos, puede evitar la complejidad de la integración con bibliotecas externas. Tampoco tiene que mover datos para averiguar, por ejemplo, si un autobús está dentro de una geovalla definida. Como Azure SQL cumple los estándares de Open Geospatial Consortium, es fácil integrar los datos almacenados en Azure SQL con bibliotecas de visualización como OpenLayers.
Las características mencionadas anteriormente se construyen sobre las bases sólidas del modelo relacional y han evolucionado a lo largo de años de mejora para satisfacer los requisitos de las aplicaciones modernas. Azure SQL Database es escalable hasta 100 TB con el nivel Hiperescala, lo que significa que puede usarlo para aplicaciones que consumen mucho almacenamiento (por ejemplo, bases de datos grandes). Azure SQL Database también es rentable cuando se usa el nivel Sin servidor, que admite el escalado automático y pausar y reanudar. Azure SQL también admite índices de almacén de columnas para realizar consultas analíticas rápidas, modelos de grafos para simplificar la administración de relaciones de objetos complejos y un optimizador de consultas de última generación que mejora continuamente y puede controlar incluso la carga de trabajo más exigente, como la de los juegos en línea multijugador actuales.
Con Azure SQL también es fácil acceder a datos estáticos, como la información de rutas proporcionada por el estándar GTFS, que se puede almacenar en una cuenta de Azure Blob Storage. Podemos usar la función OPENROWSET
en Azure SQL para importar datos desde un archivo de texto sin necesidad de utilizar otro servicio. Esto nos permite minimizar la complejidad de la solución.
Por estos motivos, Azure SQL Database es una excelente opción para aplicaciones como la de transporte en autobús, en la que se trabaja con datos JSON y datos geoespaciales, pero también se quieren aprovechar las funcionalidades de acceso a datos y procedimientos integradas en el motor. Azure SQL Database sin servidor es una excelente opción para satisfacer el requisito de escalado automático, lo que permite a la aplicación controlar las horas ocupadas durante el día en las que más viajeros intentan usar el autobús. Azure SQL Database admite también tecnologías de integración y entrega (o implementación) continuas (CI/CD), como Azure DevOps y Acciones de GitHub, que simplifican la automatización de las implementaciones.
Compilación de un servicio de API con Azure Functions
Necesita una API para acceder a la fuente GTFS y consumirla, para notificar a un usuario si un autobús ha entrado en una geovalla y para proporcionar datos a una aplicación web. Ha seleccionado Azure Functions como el servicio elegido, debido a su simplicidad y arquitectura sin servidor. Azure Functions es un excelente servicio, ya que su naturaleza sin servidor se escala de forma automática en función de las necesidades, y asume casi todos los aspectos de la infraestructura. Azure Functions proporciona compatibilidad con distintos lenguajes, por lo que puede elegir el que prefiera o el más adecuado para la tarea en la que trabaje, lo que sigue un enfoque de microservicios puros.
Envío de notificaciones con Azure Logic Apps
Para recibir una notificación de que un autobús está dentro de la geovalla y empezar a andar hacia la estación, una opción de Azure consiste en usar Azure Logic Apps. Azure Logic Apps tiene un gran número de conectores que permiten integrarlo con otros servicios. Por ejemplo, puede usar Azure Logic Apps para enviar un mensaje SMS o un correo electrónico desde una cuenta de Outlook o Gmail. Lo mejor de Azure Logic Apps es que es una plataforma de poco código o sin código, por lo que la configuración del servicio de transporte en autobús es fácil y lo puede hacer con tan solo unas acciones del mouse.
Hospedaje de una aplicación web con Azure Static Web Apps
Para visualizar datos geoespaciales, que representan las geovallas y las posiciones del autobús en un mapa, puede crear una página HTML estática mediante las conocidas bibliotecas jQuery y OpenLayers. La página estática tendrá que capturar datos de una API REST del lado servidor, proporcionada por otra función de Azure. Como los elementos de cliente y back-end son necesarios para que la página de visualización funcione, puede aprovechar las ventajas de Azure Static Web Apps. Azure Static Web Apps facilita el desarrollo e implementación de la solución, ya que combina las funcionalidades de Azure Web Apps y Azure Functions, además de integrarse con Acciones de GitHub.
Automatización de la implementación con Acciones de GitHub
Como ha visto, la solución completa se compone de varios elementos móviles: el servicio de back-end para extraer datos de la fuente en tiempo real, la base de datos para almacenar, procesar y servir los datos, y la solución de visualización de front-end, que se compone de un archivo HTML estático y un punto de conexión de API REST. Con una canalización de CI/CD mediante Acciones de GitHub, automatizará la implementación de todos los elementos, por medio de GitHub y Visual Studio Code, siempre que confirme los cambios. Los cambios en la base de datos, si los hay, junto con Azure Functions y Azure Static Web Apps, se implementarán de forma totalmente automatizada y orquestada.