nats-app/README.md
2025-10-09 05:20:06 +02:00

60 lines
2.3 KiB
Markdown

# NATS APP
Lectura de datos de sensores en un dispositivo IoT. Prueba técnica para optar
por el puesto de programador Go.
## Requisitos previos
- Docker
- NATS CLI
- Make, si prefieres la comodidad de usar Makefile
## Consideraciones
Hay partes de códigos que son _snippets_ extraídos de una librería de autoría
propia. [Repositorio GitHub](https://github.com/zepyrshut/gopher-toolbox). De
las cuales son:
- El _logger_ usando la _stdlib log/slog_.
## Bitácora
### Quickstart y toma de contacto con NATS
Lo primero que he hecho es un _quickstart_ del proyecto, con lo que siempre o
casi siempre pongo en mis experimentos. Y lo siguiente, en lugar de empezar a
construir el proyecto como loco he tratado de entender cómo funciona NATS. Al
final ha sido muy sencillo, siguiendo esos pasos:
1. Levantar el servidor NATS en Docker
2. Instalar el CLI de NATS
2. Abrir un puñado de terminales, y en un par de ellas escribir: `nats sub "hello"`
lo cual significa que se está suscribiendo al canal `hello`. Y en otra escribir:
`nats pub "hello" "Hola mundo!"`, lo cual significa que está escribiendo el
mensaje `Hola mundo!` en el canal `hello`.
![demo de NATS](./assets/nats-demo-1.png)
### Creación de la aplicación
La parte fácil es hacer todo el _boilerplate_, hecho en solo _commit_, que no es
lo ideal pero lo dicho, es puro relleno, mucho código ya viene escrito de la
librería `gopher-toolbox`. En este punto el proyecto compila pero hay error en
tiempo de ejecución por la falta de implementaciones en el repositorio.
### Empezando por el repositorio
El almacenamiento de los datos se ha optado por el uso de `TimescaleDB`, una
extensión de `PostgreSQL`, el motivo es porque ya he trabajado mucho con ese
motor y tengo los _drivers_ ya escritos. Tengo entendido que está optimizado
para trabajar con grandes cantidades de datos de series temporales, lo que viene
siendo valores de sensores por ejemplo.
Por otro lado también hay un sistema de caché muy rudimentario, en memoria que
es un mapa de valores.
Para el registro de valores y mantener ambos se ha usado el patrón decorador que
bajo un mismo _struct_ se incluye las dos implementaciones y se llama a ambas
funciones. Desde la capa servicios sólo tiene que llamar al decorador sin saber
los detalles de la implementación.