Effettuare chiamate API con sedano

8

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:

  1. Crea N oggetti nel database con una colonna result (inizialmente nulla).
  2. Crea N sedici attività e passa l'ID oggetto come parametro e carico utile
  3. Fai in modo che il sottoattività chiami l'API e aggiorni il campo del risultato dell'oggetto su successo / fallimento.
  4. Lascia che la funzione di riprova di sedano tenti di chiamare di nuovo l'API in caso di errore.

Opzione B:

  1. Crea N oggetti nel database con una colonna result (inizialmente nulla).
  2. Crea 1 attività di sedani e passa l'intero elenco di N oggetti id e N payload
  3. Passa in rassegna tutti gli oggetti N e aggiorna il database con il risultato ad ogni passaggio.
  4. 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?

    
posta user154706 26.04.2015 - 02:49
fonte

1 risposta

0

L'opzione A suona come la strada da percorrere, in quanto puoi impostare i lavoratori come API in modo indipendente invece di svolgere compiti enormi che solo un singolo operatore può gestire.

Ho uno scenario molto simile usando kombu e Celery:

  • Riceviamo un messaggio pubblicato su RMQ grazie all'integrazione in una coda RMQ
  • Abbiamo un evento di drenaggio dei consumatori di kombu
  • Quando viene ricevuto un evento, eseguiamo il callback (post in coda python locale)
  • sedani ottiene il messaggio inviato sulla coda python e lo elabora
  • Una volta terminato restituisce i risultati e inoltriamo il messaggio a un produttore di kombu
  • Il produttore torna a RMQ

Come puoi vedere, utilizziamo praticamente lo stesso approccio di te. Abbiamo questo nella gestione della produzione di circa 2000 messaggi all'ora senza problemi.

    
risposta data 20.05.2015 - 08:27
fonte

Leggi altre domande sui tag