私はバックグラウンドでより多くの作業を開始したいので、時間がかかります。過去に私は通常のバックグラウンドタスクを行うためにCeleryを使用しましたが、これはうまくいきました。Celeryによるメッセージ配信の保証方法
このアプリケーションと以前に行ったこととの唯一の違いは、これらのメッセージが処理され、失われないことを保証する必要があることです。
このアプリケーションでは、メッセージキューの速度についてあまり心配していません。信頼性と耐久性が必要です。安全を期すために、私は2つのキューサーバーを持ちたいと思っています。どちらかが間違っている場合は別のデータセンターに、もう1つはバックアップしてください。
セロリを見ると、さまざまなバックエンドをサポートしているように見えます。 redisとRabbitMQのような2つの最も人気のある外観なので、私はそれらをさらに調べるために少し時間をかけました。
のRabbitMQ: は耐久性のあるキューとクラスタリングをサポートしていますが、彼らは今日のクラスタリングを持っている方法に問題がクラスタ内のノードを紛失した場合、あなたがオンラインに戻し、そのノードを持って来るまでは、そのノード内のすべてのメッセージが利用できないということです。クラスタ内の異なるノード間でメッセージを複製せず、メッセージに関するメタデータを複製した後、元のノードに戻ってメッセージを取得します。ノードが実行されていない場合は、S.O.Lです。理想的ではない。
これを回避する方法は、第2のサーバーをセットアップし、DRBDを使用してファイルシステムを複製し、ペースメーカのようなものを実行してクライアントを必要に応じてバックアップサーバーに切り替えることです。これはかなり複雑なようですが、良い方法があるかどうかはわかりません。誰でも良い方法を知っていますか?
のRedis: が読み取りスレーブをサポートし、これは私が緊急事態の場合のバックアップを持つことができるようになるが、それはマスター・マスターの設定をサポートしていない、そしてそれはマスターの間でアクティブなフェールオーバーを処理する場合、私はわからないんだけどスレーブ。それはRabbitMQと同じ機能を持っていませんが、設定と保守がずっと簡単です。
質問:
それはメッセージ 処理を保証するようにセットアップセロリ するための最良の方法は何ですか。
誰もこれまでに行ったことはありますか?もしそうなら、 はあなたがしたことを分かち合いますか?
rabbitmqフェイルオーバーに関しては、私はすぐに何か簡単に利用できるという噂が聞こえてきました! – asksol
append_only設定を行うと、Redisは耐久性があります。しかし、redisは依然としてメッセージ確認をサポートしていません。つまり、ワーカーがそれを確認しないと、メッセージが再配信されます。 Celery Redisサポートはこれをエミュレートしますが、クライアント側でのみ実行可能です。つまり、ワーカーが突然殺されたり、電源障害が発生した場合に、未解決のメッセージが失われる可能性があります。 http://ask.github.com/celery/faq.html#should-i-use-retry-or-acks-late – asksol
を参照してください。CELERY_DISABLE_RATE_LIMITS = Trueに設定した場合、メッセージを失うことなく離れても、CELERYD_PREFETCH_MULTIPLIER = 1、CELERY_ACKS_LATE = Trueに設定し、ソロプールで実行します。しかし、それを確認する必要があります。 – asksol