Estoy diseñando un sistema para un cliente donde los requisitos son:
- suben un archivo JSON (un objeto / línea)
- hacer una llamada a una API con el objeto JSON como carga útil
- registrar el estado (éxito / fracaso) de cada llamada API en una base de datos
- vuelva a intentarlo si hay una falla.
Decidí construirlo usando apio y una base de datos sqlite como back-end. El número de líneas JSON no es grande, quizás un par de millones como máximo, lo que cabe en la memoria. Tengo todos los componentes individuales funcionando bien (puede cargar archivos, leer archivos, llamar a API, escribir a db, etc.), pero no estoy seguro acerca de la arquitectura general de despacho de tareas usando apio.
Suponiendo que haya N líneas en el archivo, debería:
Opcion A:
- Cree N objetos en la base de datos con una
result
columna (inicialmente nula). - Cree tareas de N celery y pase la identificación del objeto como parámetro y la carga útil
- Haga que la subtarea llame a la API y actualice el campo de resultados del objeto a éxito / error.
- Deje que la función de reintento de apio intente llamar a la API nuevamente en caso de falla.
Opcion B:
- Cree N objetos en la base de datos con una
result
columna (inicialmente nula). - Cree 1 tarea de apio y pase la lista completa de N identificadores de objetos y N cargas útiles
- Recorra todos los N objetos y actualice la base de datos con el resultado en cada paso.
- Cuando finaliza la tarea anterior, dispara otra tarea de apio única que lee la base de datos de todos los objetos con resultado de falla y los vuelve a intentar.
Estoy a favor de la opción A debido a su simplicidad, pero no sé cuáles son los límites en la cantidad de tareas de apio que se pueden programar y si el corredor (RabbitMQ) lo manejará. Con la opción B, el gran riesgo es que si la tarea de apio se terminara por algún motivo en alguna línea M, los siguientes objetos nunca se intentarán.
¿Alguna idea sobre estos dos o si hay una tercera mejor alternativa?