Actualmente tengo una aplicación solo de interfaz que obtiene 5-6 fuentes JSON diferentes, obtiene algunos datos necesarios de cada uno de ellos y luego muestra una página basada en dichos datos. Me gustaría mover la parte de obtención/procesamiento de datos de la aplicación a una aplicación de nodo del lado del servidor que genera un archivo JSON simple que la aplicación frontend puede obtener y procesar fácilmente.
Hay dos complicaciones notables para este proyecto:
1) La nueva aplicación de backend tendrá que vivir en un servidor diferente al de su contraparte de frontend
2) Algunas de las fuentes cambian con bastante frecuencia, por lo que necesitaré el procesamiento de back-end para verificar constantemente los cambios (cada 5-10 segundos). Actualmente, con la aplicación de solo interfaz, el navegador obtiene las últimas versiones de los feeds al cargar. Me gustaría replicar este comportamiento lo más cerca posible
Mi proceso de pensamiento para resolver esto me llevó en dos direcciones:
El primero es configurar una aplicación rápida que use setTimeout para verificar constantemente si hay nuevos datos para procesar. Luego, estos datos se envían como respuesta a una simple solicitud GET:
const express = require('express'); let app = express(); let processedData = {}; const getData = () => {...} // returns a promise that fetches and processes data /* use an immediately invoked function with setTimeout to fetch the data * when the program starts and then once every 5 seconds after that */ (function refreshData() { getData.then((data) => { processedData = data; }); setTimeout(refreshData, 5000); })(); app.get('/', (req, res) => { res.send(processedData); }); app.listen(port, () => { console.log(`Started on port ${port}`); });Luego ejecutaría una solicitud de obtención simple del cliente (después de ajustar adecuadamente los encabezados CORS) para obtener el objeto JSON.
Mis preguntas sobre este enfoque son bastante genéricas: ¿es esta una buena solución para este problema? ¿Aumentará esto los costos de hospedaje en función del procesamiento/solicitudes GET del cliente? ¿setTimeout es una buena manera de ejecutar una tarea repetidamente en el servidor?
La otra solución que estoy considerando se ocuparía de configurar un AWS Lambda que escriba el JSON resultante en un depósito s3. Sin embargo, parece que el intervalo mínimo para programar una función de AWS Lambda es de 1 minuto. Me imagino que podría configurar 3 o 4 funciones Lambda idénticas y compensarlas en 10-15 segundos, sin embargo, eso parece tan extraño que me hace sentir físicamente incómodo.
Cualquier sugerencia/indicador/solución sería muy apreciada. Todavía no soy un desarrollador de back-end con mucha experiencia, así que haga ELI5 donde lo considere oportuno.
Algunos consejos.
Utilice crontasks para el procesamiento periódico de datos. Esto es mucho más preferible, especialmente si está formateando una gran cantidad de datos.
No configure varias funciones de Lambda para la misma tarea. Va a ser complicado mantener todas esas funciones.
Después de procesar/obtener el feed, puede almacenar el archivo JSON en su propio servidor o S3. Tenga en cuenta que si es S3, entonces está pagando y esperando una operación de red. Puede leer el archivo desde su aplicación Express y simplemente enviar la respuesta a sus clientes.
Según el tamaño del archivo y su carga en el servidor, es posible que desee agregar un servidor de almacenamiento en caché para poder almacenar en caché la respuesta hasta que haya nuevos datos JSON disponibles.