バックグラウンドでより多くの作業を開始したいPythonアプリケーションがあり、ビジー状態になるにつれてスケーリングが向上します。過去に、通常のバックグラウンド タスクを実行するために Celery を使用しましたが、これはうまくいきました。
このアプリケーションと私が過去に行った他のアプリケーションとの唯一の違いは、これらのメッセージが処理され、失われないことを保証する必要があることです。
このアプリケーションでは、メッセージ キューの速度はあまり気にしません。何よりもまず信頼性と耐久性が必要です。安全のために、何か問題が発生した場合に備えて、両方とも異なるデータ センターに 2 つのキュー サーバーを配置し、一方を他方のバックアップとして使用したいと考えています。
Celery を見ると、さまざまなバックエンドをサポートしているように見えます。一部のバックエンドは他のバックエンドよりも多くの機能を備えています。最も人気のある 2 つは redis と RabbitMQ のように見えるので、時間をかけてさらに調べてみました。
RabbitMQ: 永続的なキューとクラスタリングをサポートしますが、現在のクラスタリングの方法の問題は、クラスター内のノードを失うと、そのノードをオンラインに戻すまで、そのノード内のすべてのメッセージを利用できないことです。クラスター内の異なるノード間でメッセージをレプリケートするのではなく、メッセージに関するメタデータをレプリケートするだけで、元のノードに戻ってメッセージを取得します。ノードが実行されていない場合は、SOL Not理想。
これを回避するために彼らが推奨する方法は、2 番目のサーバーをセットアップし、DRBD を使用してファイル システムを複製し、Pacemaker のようなものを実行して、必要に応じてクライアントをバックアップ サーバーに切り替えることです。これはかなり複雑に思えますが、より良い方法があるかどうかはわかりません。誰かがより良い方法を知っていますか?
Redis: 読み取りスレーブをサポートしているため、緊急時にバックアップを作成できますが、マスターとマスターのセットアップはサポートされておらず、マスターとスレーブ間のアクティブなフェイルオーバーを処理するかどうかはわかりません。RabbitMQ と同じ機能はありませんが、セットアップと保守がはるかに簡単に見えます。
質問:
メッセージ処理を保証するようにセロリをセットアップする最良の方法は何ですか?
誰もこれを以前にやったことがありますか?もしそうなら、あなたがしたことを共有していただけませんか?