dubito che questo è ancora possibile, ma qui è il problema e soluzione proposta (la fattibilità della soluzione proposta è l'oggetto di questa domanda):
Ho alcuni "dati globali" che devono essere disponibili per tutte le richieste. Sto persistendo questi dati su Riak e usando Redis come livello di cache per la velocità di accesso (per ora ...). I dati sono suddivisi in circa 30 blocchi logici, ciascuno di circa 8 KB.persistente oggetto Python in memoria per il server nginx/uwsgi
Ogni richiesta è richiesta per leggere 4 di questi blocchi da 8 KB, con conseguente 32 KB di dati letti da Redis o Riak. Questo è in AGGIUNTA a qualsiasi dato specifico della richiesta che dovrebbe anche essere letto (che è piuttosto un po ').
Supponendo anche 3000 richieste al secondo (questo non è un server live, quindi non ho numeri reali, ma 3000ps è un'ipotesi ragionevole, potrebbe essere più), questo significa 96KBps di trasferimento da Redis o Riak in ADDITION alle altre già non insignificanti chiamate effettuate dalla logica dell'applicazione. Inoltre, Python sta analizzando il JSON di questi oggetti da 8 KB 3000 volte al secondo.
Tutto questo - soprattutto Python dover ripetutamente deserializzare i dati - sembra come uno spreco assoluto, e una soluzione perfettamente elegante sarebbe di appena hanno i dati deserializzate nella cache in un oggetto nativo in memoria in Python, che posso aggiornare periodicamente come e quando tutti questi dati "statici" diventano obsoleti. Una volta in pochi minuti (o ore), anziché 3000 volte al secondo.
Ma non so se questo è possibile. Avresti realisticamente bisogno di un'applicazione "sempre in esecuzione" per memorizzare nella cache tutti i dati in essa contenuti. E so che questo non è il caso della combinazione nginx + uwsgi + python (rispetto a qualcosa di simile al nodo) - i dati in memoria di python NON verranno persi per tutte le richieste a mia conoscenza, a meno che non mi sbagli terribilmente.
Sfortunatamente questo è un sistema che ho "ereditato" e quindi non posso apportare troppe modifiche in termini di tecnologia di base, né sono sufficientemente informato su come funziona la combinazione nginx + uwsgi + python in termini di avvio Processi Python e dati persistenti in memoria di Python - il che significa che potrei essere terribilmente in errore con la mia ipotesi sopra!
Quindi, consulenza diretta dal fatto che questa soluzione avrebbe funzionato + riferimenti a materiale che possa aiutarmi a capire come il nginx + uwsgi + pitone avrebbe funzionato in termini di iniziare nuovi processi e allocazione di memoria, sarebbe di grande aiuto .
P.S:
sono passati attraverso alcune della documentazione per nginx, uwsgi ecc ma non hanno compreso appieno le ramificazioni per il mio caso d'uso ancora. Spero di fare qualche progresso su quello che sta andando avanti ora
Se la cosa in memoria POTREBBE risolvere, vorrei buttare Redis, dato che sto memorizzando SOLO i dati statici che ho citato sopra. Ciò rende la cache Python persistente in-process in-memory ancora più attraente per me, riducendo una parte in movimento nel sistema e almeno quattro round-trip di rete per richiesta.
Che aspetto hanno questi dati? Quanto è rigida la struttura? Quanto spesso cambia? – abarnert
Insieme enorme di coppie chiave-valore con alcune operazioni di nidificazione. Struttura campione (espressa come JSON): {chiave1: valore1, chiave2: {sottochiave1: [valore1, valore2, valore3], sottochiave2: valore2}, chiave3: [valore1, valore2, valore3]}. Quindi una quantità ragionevole di varietà nei dati, ma come ho detto è abbastanza statica e posso sopportare con l'aggiornamento solo ogni pochi minuti o anche ogni 1 ora. –