web-dev-qa-db-ja.com

セロリ対RQを使用する長所と短所

現在、私はpythonバックグラウンドジョブの実装を必要とするプロジェクト(主にメール送信と大量のデータベース更新のため)に取り組んでいます。タスクブローカーにRedisを使用しています。 Celery and [〜#〜] rq [〜#〜] 。これらのジョブキューの経験はありましたが、使用経験を共有してもらいたいと思います。このツール。

  1. Celery対RQを使用する利点と欠点。
  2. Celery対RQの使用に適したプロジェクト/タスクの例。

セロリはかなり複雑に見えますが、フル機能のソリューションです。実際、これらすべての機能が必要だとは思いません。反対側からは、RQは非常に単純です(構成、統合など)が、いくつかの便利な機能(タスクの取り消し、コードの自動再読み込みなど)が欠けているようです

82
Max Kamenkov

このまったく同じ質問に答えようとしているときに私が見つけたものを以下に示します。おそらく包括的なものではなく、いくつかの点で不正確な場合もあります。

要するに、RQはあらゆる点でよりシンプルになるように設計されています。セロリは、より堅牢になるように設計されています。どちらも優れています。

  • ドキュメンテーション。 RQのドキュメント は複雑なことなく包括的であり、プロジェクトの全体的なシンプルさを反映しています。紛失や混乱を感じることはありません。 Celeryのドキュメント も包括的ですが、内部化するオプションが多すぎるため、最初に設定するときにかなり頻繁に再訪することを期待してください
  • モニタリング。 Celery's Flower および RQダッシュボード は、セットアップが非常に簡単で、必要なすべての情報の少なくとも90%を提供します。

  • ブローカーのサポート。セロリは明確な勝者であり、RQはRedisのみをサポートしています。これは、「ブローカーとは何か」に関するドキュメントが少ないことを意味しますが、Redisが機能しなくなった場合、将来ブローカーを切り替えることはできません。たとえば、 InstagramはRedisとRabbitMQとCeleryの両方を考慮 です。ブローカーごとに保証が異なるため、これは重要です。 Rediscannot(執筆時点)は、メッセージが配信されることを100%保証します。

  • 優先キュー。 RQの優先度キューモデルはシンプルで効果的です。 ワーカーは順番にキューから読み取ります 。セロリは、異なるキューから消費するために複数のワーカーをスピンアップする必要があります。両方のアプローチが機能します

  • OSサポート。 RQはforkをサポートするシステムでのみ実行されるため、ここではCeleryが明確な勝者です。 Unixシステム

  • 言語サポート。 RQはPythonのみをサポートしますが、Celeryでは1つの言語から別の言語にタスクを送信できます

  • API。 Celeryは非常に柔軟です(複数の結果のバックエンド、Nice config形式、ワークフローキャンバスのサポート)が、当然この能力は混乱を招く可能性があります。対照的に、RQ APIは単純です。

  • サブタスクのサポート。 Celeryはサブタスクをサポートしています(たとえば、既存のタスク内から新しいタスクを作成する)。 RQが行うかどうかはわかりません

  • コミュニティと安定性。セロリはおそらくより確立されていますが、どちらもアクティブなプロジェクトです。執筆時点で、セリリーはGithubで〜3500個の星を、RQは〜2000個を持ち、両方のプロジェクトが活発な開発を示しています

私の意見では、セロリはその評判があなたを信じさせるほど複雑ではありませんが、あなたはRTFMをしなければなりません。

それでは、なぜ誰もが(おそらくよりフル機能の)セロリをRQと交換することをいとわないのでしょうか?私の考えでは、それはすべてシンプルさに帰着します。 Redis + Unixに限定することにより、RQはよりシンプルなドキュメント、シンプルなコードベース、シンプルなAPIを提供します。これは、作業メモリにタスクキューシステムの詳細を保持する代わりに、あなた(およびプロジェクトへの潜在的な貢献者)が関心のあるコードに集中できることを意味します。一度に頭に入れることができる詳細の数には制限があり、そこにタスクキューの詳細を保持する必要をなくすことで、RQが関心のあるコードに戻ることができます。そのシンプルさは、言語間タスクキュー、幅広いOSサポート、100%信頼できるメッセージ保証、メッセージブローカーを簡単に切り替える機能などの機能を犠牲にします。

114
Hamy

セロリはそれほど複雑ではありません。基本的に、 tutorials からステップバイステップ構成を行い、celeryインスタンスを作成し、関数を_@celery.task_で装飾してからタスクを実行しますmy_task.delay(*args, **kwargs)で。

あなた自身の評価から判断すると、(キー)機能の欠如または余計なものを選択する必要があるようです。それは私の本の選択のあまり難しいことではありません。

0
Jesse the Game