34

バックグラウンドでより多くの作業を開始したいPythonアプリケーションがあり、ビジー状態になるにつれてスケーリングが向上します。過去に、通常のバックグラウンド タスクを実行するために Celery を使用しましたが、これはうまくいきました。

このアプリケーションと私が過去に行った他のアプリケーションとの唯一の違いは、これらのメッセージが処理され、失われないことを保証する必要があることです。

このアプリケーションでは、メッセージ キューの速度はあまり気にしません。何よりもまず信頼性と耐久性が必要です。安全のために、何か問題が発生した場合に備えて、両方とも異なるデータ センターに 2 つのキュー サーバーを配置し、一方を他方のバックアップとして使用したいと考えています。

Celery を見ると、さまざまなバックエンドをサポートしているように見えます。一部のバックエンドは他のバックエンドよりも多くの機能を備えています。最も人気のある 2 つは redis と RabbitMQ のように見えるので、時間をかけてさらに調べてみました。

RabbitMQ: 永続的なキューとクラスタリングをサポートしますが、現在のクラスタリングの方法の問題は、クラスター内のノードを失うと、そのノードをオンラインに戻すまで、そのノード内のすべてのメッセージを利用できないことです。クラスター内の異なるノード間でメッセージをレプリケートするのではなく、メッセージに関するメタデータをレプリケートするだけで、元のノードに戻ってメッセージを取得します。ノードが実行されていない場合は、SOL Not理想。

これを回避するために彼らが推奨する方法は、2 番目のサーバーをセットアップし、DRBD を使用してファイル システムを複製し、Pacemaker のようなものを実行して、必要に応じてクライアントをバックアップ サーバーに切り替えることです。これはかなり複雑に思えますが、より良い方法があるかどうかはわかりません。誰かがより良い方法を知っていますか?

Redis: 読み取りスレーブをサポートしているため、緊急時にバックアップを作成できますが、マスターとマスターのセットアップはサポートされておらず、マスターとスレーブ間のアクティブなフェイルオーバーを処理するかどうかはわかりません。RabbitMQ と同じ機能はありませんが、セットアップと保守がはるかに簡単に見えます。

質問:

  1. メッセージ処理を保証するようにセロリをセットアップする最良の方法は何ですか?

  2. 誰もこれを以前にやったことがありますか?もしそうなら、あなたがしたことを共有していただけませんか?

4

5 に答える 5

3

IronMQを確認することをお勧めします。これは要件 (耐久性、高可用性など) をカバーし、クラウド ネイティブ ソリューションであるためメンテナンスは不要です。そして、そのための Celery ブローカーがあります: https://github.com/iron-io/iron_celeryなので、Celery の設定を変更するだけで使い始めることができます。

于 2013-03-01T22:15:01.927 に答える
1

Celery を既存のバックエンドにバインドすることは、必要な信頼性を保証するための間違ったソリューションだと思います。

強力な耐久性と信頼性が保証された分散キューイング システムが必要な場合は、まずそのようなシステム (実際に存在します) を探し、Python でそれにバインドする最適な方法を見つけます。それは、Celery と新しいバックエンドを介して行われる場合とそうでない場合があります。

于 2011-09-07T15:33:44.743 に答える
0

分散レンダリング システムを使用するオプションはありますか? 通常は HPC 用に予約されていますが、多くの概念は同じです。Qube または Deadline Render をチェックしてください。他にもオープンソースのソリューションがあります。高度な複雑さと、イメージ シーケンス フレームごとに数時間かかる可能性がある一部のレンダリングで失敗するリスクがあることを考慮して、すべてフェイルオーバーを念頭に置いています。

于 2011-09-18T20:48:54.533 に答える
0

この提案には Amazon SQS を使用しましたが、良い結果が得られました。キューからメッセージを削除するまでメッセージを受け取り、必要なだけアプリを大きくすることができます。

于 2011-08-31T12:38:27.050 に答える