Domanda

Ho l'upload del sito nginx caricati di manipolazione del modulo, ma ancora bisogno di trasferire i file (diciamo 3-20mb ciascuna) ai nostri cdn, e preferiscono non delegare che per un processo in background.

Qual è il modo migliore per fare questo con tornado senza bloccare altre richieste? Posso fare questo in un callback asincrona?

È stato utile?

Soluzione 2

consigli sui punti del gruppo tornado Google per utilizzare un callback asincrona (documentato a http://www.tornadoweb.org/documentation#non-blocking-asynchronous-requests ) per spostare il file al CDN.

il modulo di upload nginx scrive il file su disco e poi passa i parametri che descrivono l'upload (s) di nuovo alla vista. Pertanto, il file non è in memoria, ma il tempo necessario per leggere dal disco che causerebbe la procedura di richiesta di blocco stesso, ma non altri processi tornado, afaik-è trascurabile.

che ha detto, tutto ciò che non necessità da lavorare in linea non dovrebbe essere, e dovrebbe essere rinviata a una coda compito come celeryd o simili.

Altri suggerimenti

Si possono trovare utile nell'architettura complessiva del tuo sito per aggiungere un servizio di accodamento messaggio del tipo RabbitMQ .

Questo avrebbe permesso di completare il caricamento tramite il modulo nginx, poi nel gestore tornado, inviare un messaggio contenente il percorso del file caricato e uscire. Un processo separato sarebbe guardare per questi messaggi e gestire il trasferimento al vostro CDN. Questo tipo di servizio sarebbe utile per molti altri compiti che potrebbero essere gestiti in linea (l'invio di email, ecc ..). Come il vostro sistema cresce, questo vi dà anche un meccanismo per scalare spostando elaborazione della coda di macchine separate.

Se si utilizza un'architettura molto simile a questo. Basta fare in modo di aggiungere il vostro processo consumatore messaggio a supervisord o qualsiasi altra cosa che si utilizza per gestire i processi.

In termini di attuazione, se siete su Ubuntu installazione RabbitMQ è un semplice:

sudo apt-get install rabbitmq-server

su CentOS w / repository EPEL:

yum install rabbit-server

Ci sono una serie di Python binding a RabbitMQ. Pika è uno di loro e capita di essere creato da un dipendente di MAIUSC di sinistra , che è responsabile per RabbitMQ .

Di seguito è riportato un po 'di dal Pika pronti contro termine. Si può facilmente immaginare come il metodo handle_delivery avrebbe accettato un messaggio contenente un percorso file e spingerlo al CDN.

import sys
import pika
import asyncore

conn = pika.AsyncoreConnection(pika.ConnectionParameters(
        sys.argv[1] if len(sys.argv) > 1 else '127.0.0.1',
        credentials = pika.PlainCredentials('guest', 'guest')))

print 'Connected to %r' % (conn.server_properties,)

ch = conn.channel()
ch.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False)

should_quit = False

def handle_delivery(ch, method, header, body):
    print "method=%r" % (method,)
    print "header=%r" % (header,)
    print "  body=%r" % (body,)
    ch.basic_ack(delivery_tag = method.delivery_tag)

    global should_quit
    should_quit = True

tag = ch.basic_consume(handle_delivery, queue = 'test')
while conn.is_alive() and not should_quit:
    asyncore.loop(count = 1)
if conn.is_alive():
    ch.basic_cancel(tag)
    conn.close()

print conn.connection_close
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top