質問

サイトのアップロードを処理する nginx アップロード モジュールがありますが、それでもファイル (それぞれ 3 ~ 20 MB としましょう) を cdn に転送する必要があり、それをバックグラウンド ジョブに委任したくありません。

他のリクエストをブロックせずにトルネードでこれを行う最善の方法は何ですか?これを非同期コールバックで実行できますか?

役に立ちましたか?

解決 2

非同期コールバックを使用する竜巻、Googleのグループポイントの

アドバイス(で立証http://www.tornadoweb.org/documentation#non-blocking-asynchronous-requests の)CDNにファイルを移動します。

nginxのアップロードモジュールは、ファイルをディスクに書き込み、その後、バックビューへのアップロード(単数または複数)を記述するパラメータを渡します。そのため、ファイルがメモリ内にありませんが、時間がそれは、ディスク要求プロセスは、それ自体をブロックさせるから読み取るのにかかるではなく、他の竜巻プロセス、無視できる程度の知る限り-です。

の必要性のオンライン処理するにはすべきではないしない、とcelerydまたは類似のようなタスクキューに延期する必要があります。

何を言っています

他のヒント

サイトのアーキテクチャ全体において、次のようなメッセージ キュー サービスを追加すると便利な場合があります。 ラビットMQ.

これにより、nginx モジュールを介してアップロードを完了し、トルネード ハンドラーで、アップロードされたファイル パスを含むメッセージを投稿して終了できます。別のプロセスがこれらのメッセージを監視し、CDN への転送を処理します。このタイプのサービスは、オフラインで処理できる他の多くのタスク (電子メールの送信など) に役立ちます。)。システムの成長に応じて、キューの処理を別のマシンに移動して拡張するメカニズムも提供します。

私はこれとよく似たアーキテクチャを使用しています。メッセージコンシューマープロセスを必ず追加してください 監視された またはプロセスを管理するために使用しているもの。

実装に関しては、Ubuntu を使用している場合、RabbitMQ のインストールは簡単です。

sudo apt-get install rabbitmq-server

EPEL リポジトリを備えた CentOS の場合:

yum install rabbit-server

RabbitMQ への Python バインディングは多数あります。 ナキウサギ もそのうちの 1 つで、たまたまある人によって作成されました。 従業員Lシフト, 、RabbitMQの責任者です。

以下は少しです サンプルコード ピカレポより。handle_delivery メソッドがファイルパスを含むメッセージをどのように受け入れて 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