Motor Dinámico de Notificaciones & Centro de Preferencias
Arquitectura End-to-End: De microservicios distribuidos y optimización batch en backend, a una experiencia móvil resiliente de alta fidelidad.
Ficha de Proyecto
Motor Dinámico de Notificaciones & Centro de Preferencias
Rol Técnico
Full Stack / Mobile & Backend Engineer
Enfoque de Arquitectura
Sistemas Distribuidos · Optimización Batch · Resiliencia Móvil
Contexto de negocio
El Desafío y Contexto de Negocio
En aplicaciones de servicios vehiculares y movilidad con alto volumen de transacciones, la saturación de comunicaciones no deseadas desencadena el silenciamiento de notificaciones a nivel de sistema operativo o la desinstalación directa de la app. El ecosistema técnico heredado presentaba tres cuellos de botella fundamentales:
Catálogo estático y rígido
Los tipos de notificación estaban acoplados mediante enumeraciones en código. Crear o modificar una categoría requería tocar múltiples repositorios y redesplegar servicios.
Control binario de todo o nada
Solo existía una bandera global (disableAll). Si el usuario deseaba silenciar promociones, se veía obligado a perder alertas operativas críticas como citas de taller o revisiones vehiculares.
Desperdicio de recursos en broadcast
Los envíos masivos creaban registros in-app y disparaban peticiones externas a Firebase sin validar previamente si los destinatarios deseaban recibir dicha categoría, generando sobrecostos de I/O y red.
Ingeniería de Sistemas
Arquitectura de la Solución End-to-End
Estructuración modular de microservicios con validación de preferencias en cascada y compuerta de descarte temprano:
Flutter Mobile & Admin
Centro de ajustes granular, debouncing de eventos y selector dinámico en dashboard/CMS.
Notification Service
Catálogo dinámico, reglas de opt-in en cascada y resolución virtual de preferencias en tiempo de ejecución.
MongoDB & Batch Filter
Colecciones dinámicas indexadas y descarte anticipado de destinatarios no elegibles antes de persistir.
Firebase FCM Gate
Compuerta de seguridad que omite tokens de dispositivos silenciados con estado auditado `skipped_preference`.
Experiencia Móvil (Flutter)
- Centro de ajustes interactivo con tarjetas independientes por categoría de interés (Citas de taller, Mantenimiento, Perfil, Novedades, Reservas).
- Control de concurrencia y debouncing para mitigar condiciones de carrera ante toques rápidos repetidos.
- Rollback optimista: si una petición falla por timeout o pérdida de red, el switch revierte de forma limpia a su posición confirmada.
- Pantallas de recuperación contextual con deep links directos a configuración cuando el usuario consulta su bandeja estando desactivado.
API Gateway & Control de Acceso
- Asociación estricta de preferencias al token JWT del usuario para garantizar consistencia multisesión.
- Exposición de endpoints securizados para consumo desde la app móvil, el portal administrativo y el CMS.
Motor de Notificaciones & Catálogo Dinámico
- Entidad NotificationType con índices únicos, auditoría y validación estricta de claves por expresión regular (^[a-z][a-z0-9_]{1,63}$).
- Resolución virtual de preferencias: cruza el catálogo activo con las preferencias guardadas en tiempo de ejecución, ofreciendo opt-in por defecto sin inflar la base de datos con registros vacíos.
- Reglas de negocio en cascada: (1) Sin registro → permitir; (2) disableAll global → bloquear; (3) Sin tipo declarado → respetar regla global; (4) Tipo declarado → verificar switch específico.
Early Discard Gate & Despacho Cloud
- Filtro en lote previo: la función filterEligibleUserIdsForPush evalúa y depura la lista de destinatarios antes de persistir notificaciones in-app o llamar a Firebase.
- Compuerta de despacho FCM: canReceivePush valida la elegibilidad antes de resolver tokens de dispositivos, registrando el estado skipped_preference para auditoría.
- Integración automática con jobs de mantenimiento programado, citas y publicaciones del CMS.
Valor de Ingeniería
Capacidades Clave Implementadas
Mecanismos desarrollados para resolver cuellos de botella de concurrencia, desacoplamiento y escalabilidad.
Catálogo Zero-Deployment
El equipo operativo puede dar de alta nuevos tipos de notificación desde el dashboard sin requerir nuevos despliegues de backend ni aprobaciones de tienda.
Descarte Temprano en Batch
Filtrado masivo de destinatarios previo al almacenamiento y al encolado FCM, optimizando escrituras en MongoDB y consumos de cuota cloud.
UI Resiliente & Rollback
Feedback contextual, control de debouncing y reversión automática de switches ante fallos de conexión garantizan consistencia absoluta.
Recuperación Amigable
Pantallas informativas contextuales guían al usuario hacia la reactivación con un solo toque en caso de requerir alertas clave.
Calidad de Código
Pruebas Automatizadas y Fiabilidad
Suite de pruebas exhaustivas para validar la integridad del motor de decisión y evitar regresiones en producción:
Pruebas unitarias de catálogo (CRUD, unicidad de claves, formatos regex inválidos).
Pruebas del motor de preferencias (cascada de reglas, usuarios nuevos, completado dinámico de items virtuales).
Pruebas del gate FCM (validación de descarte con resultado skipped_preference sin disparar llamadas de red a Firebase).
Pruebas de repositorio para operaciones batch e inserciones masivas depuradas.
Métricas & Resultados
Impacto Técnico y de Producto
Resultados medibles alcanzados tras la implementación y puesta en marcha del ecosistema.
Zero-Release
Agilidad Operativa
Nuevas campañas y tipos de alerta se configuran al instante desde el panel sin alterar código.
Optimizado
Eficiencia Cloud
Ahorro de lecturas/escrituras en MongoDB y llamadas a FCM mediante filtrado temprano de destinatarios.
100%
Consistencia de Estado
Persistencia securizada en backend con protección ante condiciones de carrera y caídas de red.
Respetuoso
Retención de Usuarios
Prevención de desinstalaciones al otorgar control granular y transparente sobre las alertas recibidas.
¿Tienes un reto similar de arquitectura o sincronización?
Analicemos los requerimientos de tu infraestructura técnica y diseñemos una arquitectura escalable y tolerante a fallos para tus aplicaciones móviles y backend.
Llamada de Diagnóstico