Requerimientos no funcionales¶
Los objetivos de rendimiento piensan en conexiones móviles comunes en Centroamérica, no en fibra óptica, y los de infraestructura en un equipo sin presupuesto de operación.
- Total: 16
| ID | Categoría | Requerimiento | Medida de verificación |
|---|---|---|---|
RNF-01 |
Rendimiento | La primera vista carga rápido en 4G | Manifiesto ≤ 30 KB y primera capa ≤ 300 KB comprimidos |
RNF-02 |
Rendimiento | Inspeccionar una celda se siente inmediato | p95 ≤ 200 ms en el servidor, sin caché |
RNF-03 |
Caché | La mayoría de las lecturas no llega al servidor | Rutas con versión inmutables; tasa de aciertos de CDN ≥ 90 % |
RNF-04 |
Escala | Unas pocas regiones, bien servidas | 5 regiones, 1 M de celdas y 200 adquisiciones por región y año |
RNF-05 |
Infraestructura | El motor corre junto a los datos | Instancia en AWS us-west-2; lectura directa de S3 |
RNF-06 |
Almacenamiento | El disco crece con lo necesario | Recortes nativos, no productos completos; ≤ 10 GB/región/año |
RNF-07 |
Arquitectura | API y motor en una sola instancia | compose.yml levanta todo en una máquina |
RNF-08 |
Disponibilidad | La app funciona aunque la API no responda | Con la API detenida, mapa, fechas y resumen cargan |
RNF-09 |
Seguridad | Las credenciales de Earthdata no se filtran | Nunca en el repositorio, en registros ni en respuestas |
RNF-10 |
Seguridad | La API pública no se puede saturar | Límite de tasa por IP; exploraciones con límite propio |
RNF-11 |
Reproducibilidad | Cualquier persona regenera los resultados | Misma entrada, mismos artefactos byte a byte |
RNF-12 |
Ética y datos | No se exponen datos personales ni se acusa | Sin cookies de rastreo ni datos de titularidad |
RNF-13 |
Apertura | Código y datos abiertos | Código MIT; datos derivados CC BY 4.0 |
RNF-14 |
Accesibilidad | Las capas se leen con cualquier visión del color | Ninguna capa depende solo de rojo y verde |
RNF-15 |
Mantenibilidad | El motor es modular y está probado | Un módulo por etapa; pruebas con la escena sintética |
RNF-16 |
Observabilidad | Se sabe qué hizo el motor y cuándo | Cada ejecución registrada; alertas por correo al operador |
RNF-01¶
Primera vista en menos de tres segundos sobre 4G
El manifiesto de una región con 31 fechas pesa menos de 30 KB comprimido y la primera capa menos de 300 KB. La app nunca descarga la serie completa de una región, que para 230 000 celdas y 31 fechas ronda los 30 MB: recibe capas ya dibujadas y celdas una por una.
RNF-02¶
Una celda en menos de 200 ms
La serie de una celda es una sola fila leída por llave, con sus arreglos de HH, HV y clases. El objetivo es el percentil 95 en el servidor, sin caché, sobre una corrida de 230 000 celdas y 31 fechas.
RNF-03¶
Caché por versión
Las respuestas de rutas con versión llevan
Cache-Control: public, max-age=31536000, immutable y ETag. Las rutas sin
versión, como el manifiesto vigente, como máximo max-age=300. Las capas y
descargas se sirven desde Bunny CDN.
RNF-04¶
Escala objetivo
El diseño apunta a cinco regiones, cada una de hasta un millón de celdas de
1 ha, con hasta 200 adquisiciones por año, y a mantener las tres últimas
corridas publicadas por región. Más allá de eso hace falta revisar
D-04 y D-06.
RNF-05¶
Instancia en
us-west-2
La instancia corre en AWS us-west-2, donde ASF guarda NISAR, porque la lectura
directa de S3 con credenciales de Earthdata solo funciona desde esa región y es
gratuita dentro de ella. Fuera de ella el motor sigue funcionando por HTTPS, más
lento. Referencia: una t3.medium con 50 GB gp3.
RNF-06¶
Almacenamiento acotado
En disco solo viven los recortes a resolución nativa (unos 50 a 100 MB por adquisición y región) y las grillas agregadas. Los productos completos (unos 6 GB cada uno) nunca se guardan. Antes de cada recorte el motor comprueba el espacio libre y se detiene si no alcanza.
RNF-07¶
Una sola instancia
La API, PostgreSQL, Redis y el trabajador del motor corren en la misma instancia
con compose.yml. La app web se publica aparte como sitio estático (GitHub
Pages o Vercel).
RNF-08¶
Respaldo estático
Al publicar una corrida, el motor deja en la CDN el manifiesto, las capas, los resúmenes y las descargas con la forma del contrato. Si la API no responde, la app usa el respaldo y solo pierde el inspector de celdas y la exploración de umbrales.
RNF-09¶
Credenciales de Earthdata
El token de Earthdata vive en AWS Systems Manager Parameter Store o en un archivo de entorno legible solo por el servicio. No aparece en el repositorio, en los registros, en la bitácora ni en ninguna respuesta. Las credenciales temporales de S3 se renuevan cinco minutos antes de vencer.
RNF-10¶
Protección de la API pública
Las rutas públicas tienen límite de tasa por IP con el mecanismo del template. Las exploraciones de umbrales, que sí calculan, tienen un límite más estricto y un tiempo máximo de cálculo de cinco segundos.
RNF-11¶
Reproducibilidad
El código, los perfiles de umbrales y la lista de gránulos de cada corrida son públicos. Con ellos y los insumos declarados, cualquier persona regenera la corrida y obtiene los mismos artefactos byte a byte. El bootstrap usa semilla fija.
RNF-12¶
Ética y privacidad
Sin cookies de rastreo y sin datos personales en la API pública. Los textos y
las leyendas presentan los hallazgos como hipótesis por verificar, por
RN-16.
RNF-13¶
Apertura y atribución
Código con licencia MIT y datos derivados con CC BY 4.0. El manifiesto y la ruta de método llevan los créditos de NASA, ISRO, ASF, ESA (Copernicus DEM), Global Mangrove Watch y demás fuentes, con su licencia.
RNF-14¶
Accesibilidad de las capas
Como el backend dibuja las capas, la accesibilidad del color es su responsabilidad: paletas aptas para daltonismo, que no dependen solo de rojo y verde, y leyendas con contraste de al menos 4,5:1. La API devuelve códigos, no textos; los textos en español e inglés son del frontend.
RNF-15¶
Mantenibilidad
Un módulo por etapa del motor (ingesta, agregación, clasificación, métricas, capas, publicación), cada uno con pruebas. Una escena sintética generada con un modelo físico simple, que trae su propia verdad, es el dato de prueba de la clasificación y de las métricas.
RNF-16¶
Observabilidad
Cada sincronización y cada corrida registran su inicio, su fin, su resultado y sus conteos. El operador recibe un correo cuando una sincronización falla tres veces seguidas, cuando el disco supera el 80 % y quince días antes de que venza el token de Earthdata.