Batalha dos Barris — Reproductor de Ranking en TV

Aplicación Angular (PWA) que muestra en tiempo real, en TV/monitor, los rankings de consumo de una cervecería, alimentada con datos sincronizados directamente desde el POS del local.

Portada del reproductor de TV con el podio del ranking 'Batalha dos Barris' y un panel lateral con contenido promocional.

Problema

Una cervecería necesitaba mostrar rankings de consumo en TV/monitor, alimentados por el PDV del local. El hardware era una TV Box Android encendida 24/7; la red caía; el PDV reiniciaba a diario. Sin intervención manual, los datos debían seguir casi en tiempo real.

Solución e impacto

Monorepo con player Angular 17 PWA, API Flask/PostgreSQL (caché + OpenAPI) y un agente Python que sincroniza ventas del MySQL del PDV vía túnel SSH, con reanudación de estado y sync incremental periódico. El resultado de ingeniería es una cadena de extremo a extremo lo bastante estable para operar sin supervisión constante.

Arquitectura y trade-offs

Separar player, API y agente aisló fallos: el front optimizado para hardware limitado no depende del MySQL legado; el agente absorbe la complejidad del túnel SSH y del ciclo de vida del PDV. La caché en la API reduce presión sobre PostgreSQL bajo el polling del player. Trade-off: sync periódico no es streaming verdadero — es near-real-time pragmático, más simple de operar que websockets en una TV Box.

Diagrama de sync legado: PDV MySQL, agente Python, PostgreSQL, Flask API e Angular PWA em TV Box

Operación y observabilidad

Deploy via GitHub Actions; Cypress no player. Healthchecks do agente e alertas de lag de sync são o próximo nível — hoje a resiliência vem da retomada de estado e do intervalo periódico configurável tolerante a quedas de rede.

Desafíos técnicos

Resiliencia a caídas de red y reinicios del PDV, reanudación correcta del cursor de sync, y UX de ranking fluida en TV Box con Service Worker — además de deploy automatizado (GitHub Actions) y cobertura Cypress en el player.

Qué haría diferente

Formalizaría antes healthchecks del agente y alertas cuando el lag de sync supere un umbral. El intervalo periódico configurável y el modelo de reanudación siguen encajando; lo que reforzaría es la observabilidad operativa para un entorno 24/7.

Contexto técnico

  • IncrementalSyncAgente con retomada de estado
  • 3 capasArquitecturaPlayer, API y agente aislados

Stack

  • Angular 17
  • TypeScript
  • RxJS
  • Angular Service Worker
  • Flask
  • PostgreSQL
  • psycopg
  • Python
  • Docker
  • GitHub Actions
  • Cypress