[解決済み] CeleryとRQを比較した場合のメリットとデメリット【終了しました
質問
現在、私はいくつかのバックグラウンドジョブ(主にメール送信と大量のデータベース更新)を実装する必要があるPythonのプロジェクトに取り組んでいます。私はタスクブローカーにRedisを使用しています。そこで、現時点では2つの候補があります。 セロリ と RQ . 私はこれらのジョブキューを使った経験がありますが、皆さんにこのツールの使用経験を共有してもらいたいと思います。というわけで。
- CeleryとRQの使い分けのメリットとデメリットについて。
- CeleryとRQを使い分けるのに適したプロジェクト/タスクの例があれば教えてください。
Celeryはかなり複雑に見えますが、フル機能のソリューションです。実際、私はこれらの機能すべてが必要だとは思っていません。一方、RQは非常にシンプルですが(例:設定、統合)、いくつかの便利な機能(例:タスクの取り消し、コードの自動リロード)が欠けているように思えます。
どのように解決するのですか?
このまったく同じ質問に答えようとして、私が見つけたものは以下のとおりです。おそらく包括的ではなく、いくつかの点では不正確かもしれません。
要するに、RQ は全体的によりシンプルになるように設計されています。Celery は、より堅牢になるように設計されています。どちらも優れています。
- ドキュメンテーション。 RQのドキュメント は複雑でなく包括的であり、プロジェクト全体のシンプルさを反映しているので、迷ったり混乱したりすることはないでしょう。 Celeryのドキュメント も包括的ですが、最初にセットアップするときに、あまりに多くのオプションがあるため、かなり再確認することになるでしょう。
-
モニタリング。 セロリの花 と、その RQダッシュボード は、どちらも設定が非常に簡単で、あなたが必要とするすべての情報の少なくとも90%を与えてくれます。
-
ブローカーのサポート。Celeryが明らかに勝者で、RQはRedisのみをサポートしています。これは、「ブローカーとは何か」についてのドキュメントが少ないことを意味しますが、将来的にRedisが機能しなくなった場合にブローカーを切り替えることができないことも意味します。例えば インスタグラムでは、CeleryでRedisとRabbitMQの両方を検討しました。 . ブローカーによって保証が異なるため、これは重要です。例えば、Redis は (執筆時点では)メッセージの配信を100%保証することはできません。
-
優先キュー RQsの優先キュー・モデルは、シンプルで効果的です -。 ワーカーはキューから順番に読み込む . Celeryでは、異なるキューから消費するために複数のワーカーをスピンアップする必要があります。どちらのアプローチも動作します。
-
OSのサポート。RQは以下のOSをサポートするシステムでのみ動作するため、ここではCeleryが明らかに勝者となります。
fork
例:Unixシステム -
言語のサポート。RQはPythonしかサポートしていませんが、Celeryはある言語から別の言語へタスクを送ることができます
-
APIです。Celeryは非常に柔軟ですが(複数の結果バックエンド、素敵な設定フォーマット、ワークフローキャンバスのサポート)、当然ながらこのパワーは混乱を招く可能性があります。対照的に、RQのAPIはシンプルです。
-
サブタスクのサポート。Celeryはサブタスクをサポートしています(既存のタスクの中から新しいタスクを作成するなど)。RQがそうであるかは知らないが
-
コミュニティと安定性。Celeryの方がより確立されていると思われますが、どちらも活発なプロジェクトです。この記事を書いている時点で、Celery は Github で ~3500 のスターを持ち、RQ は ~2000 で、両方のプロジェクトが活発な開発をしていることがわかります。
私の意見では、Celeryはその評判が信じるほど複雑ではありませんが、RTFMする必要があります。
では、なぜ誰もが (間違いなくよりフル機能の) Celery と RQ を交換しようとするのでしょうか。私の考えでは、すべてはシンプルであることに尽きます。Redis+Unixに限定することで、RQはよりシンプルなドキュメント、よりシンプルなコードベース、そしてよりシンプルなAPIを提供します。つまり、あなた(とあなたのプロジェクトに貢献する可能性のある人)は、タスクキューシステムについての詳細をワーキングメモリに保持する代わりに、あなたが気になるコードに集中することができるのです。私たちは皆、一度にどれだけの詳細を頭の中に入れることができるかという限界を持っています。タスク・キューの詳細を頭の中に入れておく必要性を取り除くことによって、RQはあなたが関心を持つコードに戻ることができるのです。このシンプルさは、言語間タスク キュー、幅広い OS サポート、100% 信頼できるメッセージ保証、およびメッセージ ブローカーを簡単に切り替えられる機能などの機能を犠牲にしています。
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】なぜPostgreSQLのようなデータベース上でRabbitMQのようなメッセージブローカーが必要なのでしょうか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] if 節の終了方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] Python Empty Generator 関数
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?