Domanda

Ho un'applicazione web Piloni servito da Apache (mod_wsgi, prefork). A causa di Apache, ci sono più processi separati in esecuzione il mio codice di applicazione contemporaneamente. Alcuni dei compiti non critici che il ricorso non voglio rinviare per l'elaborazione in background per migliorare i tempi di risposta "dal vivo". Così sto pensando di coda compito, molti processi Apache aggiungendo compiti da questa coda, un unico processo Python separata elaborazione loro uno per uno e la rimozione dalla coda.

La coda dovrebbe preferibilmente essere persistente su disco in modo coda compiti non trasformati non vengono persi a causa di un'interruzione di alimentazione, riavvio del server, ecc La domanda è: quello che sarebbe un modo ragionevole per implementare tale coda ?

Per quanto riguarda le cose che ho provato: ho iniziato con semplici database SQLite e tavolo unico in esso per la memorizzazione di elementi della coda. Nel test di carico, quando si aumenta il livello di concorrenza, ho cominciato a ricevere gli errori "di database bloccato", come previsto. La correzione quick'n'dirty era quello di sostituire SQLite con MySQL - gestisce problemi di concorrenza bene, ma si sente come un peso inutile per il semplice cosa che devo fare. operazioni di DB code legate mostrano anche visibile nei miei rapporti profiling.

È stato utile?

Soluzione

Un broker messaggio come è la soluzione ideale qui.

Il gasdotto potrebbe essere seguente:

  • Processo di applicazione che è responsabile per la gestione di richieste HTTP genera risposte in modo rapido e manda a bassa priorità, compiti pesanti alla coda AMQ.
  • Uno o più altri processi sono iscritti a consumare coda AMQ e fare ciò che è destinato a che fare con questi compiti pesanti.

Il requisito della coda di persistenza è soddisfatta dalla scatola dal ActiveMQ memorizza i messaggi che non sono ancora consumati in memoria persistente. Inoltre scale abbastanza bene, visto che sei libero di distribuire più HTTP-apps, applicazioni multiple di consumo e si AMQ su macchine diverse ogni.

Usiamo qualcosa di simile nel nostro progetto scritto in Python utilizzando STOMP protocollo di comunicazione come sottostante .

Altri suggerimenti

Un server web (qualsiasi server web) è multi-produttore, processo singolo consumatore.

Una soluzione semplice è quella di costruire un wsgiref o Werkzeug server di back-end per gestire le vostre richieste di back-end.

Dal momento che questo server "back-end" è costruire utilizzando la tecnologia WSGI, è molto, molto simile al web server front-end. Tranne. Non produce risposte HTML (JSON solito è più semplice). Oltre a questo, è molto semplice.

Si progetta transazioni riposante per questo backend. È possibile utilizzare tutte le varie caratteristiche WSGI per URI analisi, autorizzazione, autenticazione, ecc - in genere - non hanno bisogno di gestione della sessione, dal momento che i server RESTful di solito non offrono sessioni.

Se si entra in seri problemi di scalabilità, è sufficiente avvolgere il server back-end in lighttpd o qualche altro motore Web per creare un backend multi-threaded.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top