Sto progettando un sistema per un cliente in cui i requisiti sono:
- caricano un file JSON (un oggetto / linea)
- effettua una chiamata a un'API con l'oggetto JSON come payload
- registra lo stato (successo / fallimento) di ogni chiamata API in un database
- fai un tentativo se c'è un errore.
Ho deciso di costruirlo usando il sedano e un database SQLite come back-end. Il numero di linee JSON non è grande, forse un paio di milioni al massimo, che si adatta alla memoria. Ho tutti i singoli componenti che funzionano bene (posso caricare file, posso leggere file, posso chiamare API, posso scrivere in db, ecc.), Ma non sono sicuro dell'architettura generale delle attività di dispacciamento che utilizzano il sedano.
Supponendo che ci siano N righe nel file, dovrei:
Opzione A:
- Crea N oggetti nel database con una colonna
result
(inizialmente nulla). - Crea N sedici attività e passa l'ID oggetto come parametro e carico utile
- Fai in modo che il sottoattività chiami l'API e aggiorni il campo del risultato dell'oggetto su successo / fallimento.
- Lascia che la funzione di riprova di sedano tenti di chiamare di nuovo l'API in caso di errore.
Opzione B:
- Crea N oggetti nel database con una colonna
result
(inizialmente nulla). - Crea 1 attività di sedani e passa l'intero elenco di N oggetti id e N payload
- Passa in rassegna tutti gli oggetti N e aggiorna il database con il risultato ad ogni passaggio.
- Una volta completata l'attività precedente, viene avviata un'altra attività celery una tantum che legge il database per tutti gli oggetti con esito negativo e li riprova.
Preferisco l'opzione A per la sua semplicità, ma non so quali siano i limiti sul numero di attività sedaniche che possono essere programmate e se il broker (RabbitMQ) lo gestirà. Con l'opzione B, il grosso rischio è che se il compito di sedano dovesse essere interrotto per qualsiasi motivo su qualche linea M, allora tutti i seguenti oggetti non saranno mai provati.
Qualche idea su questi due o se c'è una terza alternativa migliore?