문제

Nginx 업로드 모듈 처리 사이트 업로드가 있지만 여전히 파일 (각각 3-20MB라고 함)을 CDN으로 전송해야하며,이를 백그라운드 작업에 위임하지 않겠습니다.

다른 요청을 차단하지 않고 토네이도로 이것을하는 가장 좋은 방법은 무엇입니까? 비동기 콜백으로 이것을 할 수 있습니까?

도움이 되었습니까?

해결책 2

Tornado Google Group에 대한 조언은 Async 콜백을 사용하는 것을 가리 킵니다 (문서화 http://www.tornadoweb.org/documentation#non-blocking-asynchronous-requests) 파일을 CDN으로 이동합니다.

Nginx 업로드 모듈은 파일을 디스크에 쓰고 업로드를 뷰로 설명하는 매개 변수를 전달합니다. 따라서 파일은 메모리에 있지 않지만 디스크에서 읽는 데 걸리는 시간은 요청 프로세스가 자체적으로 차단되지만 다른 토네이도 프로세스는 Afaik이 무시할 수 있습니다.

즉, 그렇지 않은 것 필요 온라인으로 처리 되려면되어서는 안되며 같은 작업 대기열로 연기되어야합니다. celeryd 또는 유사합니다.

다른 팁

사이트의 전체 아키텍처에서 다음과 같은 메시지 대기 서비스를 추가하는 것이 유용 할 수 있습니다. Rabbitmq.

이렇게하면 Nginx 모듈을 통해 업로드를 완료 한 다음 토네이도 핸들러에서 업로드 된 파일 경로 및 종료가 포함 된 메시지를 게시 할 수 있습니다. 별도의 프로세스는 이러한 메시지를보고 CDN으로의 전송을 처리하는 것입니다. 이 유형의 서비스는 오프라인으로 처리 할 수있는 다른 많은 작업 (이메일 보내기 등)에 유용합니다. 시스템이 성장함에 따라 큐 처리를 분리 된 기계로 이동시켜 스케일링하는 메커니즘을 제공합니다.

나는 이것과 매우 유사한 아키텍처를 사용하고 있습니다. 메시지를 추가하여 소비자 프로세스를 추가하십시오. 감자 또는 프로세스를 관리하기 위해 사용하는 모든 것.

구현 측면에서 Ubuntu에있는 경우 RabbitMQ를 설치하는 경우 간단합니다.

sudo apt-get install rabbitmq-server

Epel 리포지토리와 함께 Centos :

yum install rabbit-server

RabbitMQ에 대한 많은 파이썬 바인딩이 있습니다. 피카 그들 중 하나이며 직원Lshift, RabbitMQ를 책임지는 사람.

아래는 약간입니다 샘플 코드 Pika Repo에서. handle_delivery 메소드가 FilePath가 포함 된 메시지를 수락하고 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top