最近の仕事でセロリに出会いました。これは、Github で 18,000 個のスターを獲得したオープンソースの分散タスク キューです。主に、アプリケーションで非同期タスクとスケジュールされたタスクを実装するために使用できます。 Python で書かれていますが、プロトコルはどの言語でも実装できます。すでに gocelery、nodecelery、celery-php が存在します。 著者は、Celery と仕事での使用についての理解をまとめるためにこの記事を書きました。この記事の主な内容は次のとおりです。
タスクキューとは何ですか?バックエンドの学生はすべて「メッセージキュー」に精通している必要があります。一般的なものには、RabbitMQ、RocketMQ、Kafka などがあります。 「タスク キュー」という言葉については、Celery に触れるまで聞いたことがありませんでした。タスク キューとは何ですか? また、タスク キューとメッセージ キューの関係は何ですか?これらの質問を念頭に置いて、Celery アーキテクチャを見てみましょう。 セロリ Celery アーキテクチャでは、複数のサーバーが非同期タスク (Async Task) を開始し、そのタスクを Broker キューに送信し、その中で Celery Beat プロセスがスケジュールされたタスクを開始する役割を担っていることがわかります。タスクがブローカーに到着すると、対応する Celery ワーカーに配布され、処理されます。タスクが処理されると、その結果がバックエンドに保存されます。 上記のプロセスでは、Celery はブローカーとバックエンドを実装せず、メッセージ キュー サービスを提供するブローカーとして RabbitMQ を使用し、結果ストレージ サービスを提供するバックエンドとして Redis などの既存のオープン ソース実装を使用します。 Celery は、メッセージ キュー アーキテクチャにおける Producer と Consumer の実装を抽象化したようなもので、メッセージ キュー内の基本単位「メッセージ」をタスク キュー内の「タスク」に抽象化し、非同期タスクやスケジュール タスクの開始、結果の保存などの操作をカプセル化することで、開発者が AMQP、RabbitMQ などの実装の詳細を無視できるようにし、開発の利便性を高めます。 要約すると、タスク キューとしての Celery は、メッセージ キューに基づいてさらにカプセル化されたものであり、その実装はメッセージ キューに依存します。 次に、簡単なアプリケーションを使用して、Celery の機能を理解しましょう。 セロリの働きアプリケーション開発では、応答速度を確保するために、プロセスに影響を与えない時間のかかる操作は非同期で処理されるのが一般的です。たとえば、ユーザー登録プロセス中は、通常、ユーザーに通知するために電子メールが非同期的に送信されます。 Celery がこの非同期操作をどのように実装するかを見てみましょう。 task.py では、メールを送信するための send_mail メソッドが宣言され、Celery が提供する @app.task デコレータが追加されます。このデコレータを使用すると、send_mail 関数を celery.app.task:Task インスタンス オブジェクトに変換できます。 Task インスタンスは、次の 2 つのコア機能を提供します。
タスクが定義されました。非同期タスクを開始するには、Task の delay メソッドを呼び出して、キューにメッセージを送信します。たとえば、ユーザー登録が完了すると、電子メールを送信する非同期タスクが開始されます。
上記のプログラムを実行すると、メッセージは RabbitMQ キューに送信され、そのメッセージ形式は次のようになります。 RabbitMQのタスク Celery によってカプセル化されたメッセージには、タスク識別子と実行パラメータが含まれていることがわかります。 次に、RabbitMQ からのメッセージを消費するワーカーを起動します。
Worker が起動すると、次の情報が印刷されます。 ワーカー開始 まずワーカーの構成情報が来ます。次にワーカーによって実行されるタスクのリストが来ます。そして RabbitMQ からメッセージを正常に取得し、対応するタスクを実行します。 上記の例を通じて、タスク キュー フレームワークとしての Celery の働きをさらに理解することができます。 「分散タスクキュー」の「分散」とは、複数のプロデューサーとコンシューマーが存在する可能性があることを意味します。つまり、複数のプロセスがブローカーにタスクを送信し、複数のワーカーがブローカーからタスクを取得して実行します。 上記は単なる簡単な例です。仕事で Celery を使用した実際の経験をいくつか見てみましょう。 セロリの活用ビジネスシナリオに応じてキューを分割する 私が取り組んでいるプロジェクトでは、Celery を使用して、注文の配置、軌道の解析、アップストリームのプッシュなどの非同期タスクとスケジュールされたタスクを処理します。各タスクのビジネス シナリオに応じて、対応するキューを指定できます。次に例を示します。
ビジネス シナリオに応じて、DEFAULT_CELERY_ROUTES 構成の 6 つのタスクに対応するキューを指定します。キューは合計で、作成、プル、プッシュの 3 つあります。ルーティング ルールを有効にするには、CELERY_ROUTES に追加します。この設計の目的は、異なるシナリオが互いに影響を及ぼさないようにすることです。たとえば、解析タスクのブロックは注文配置タスクに影響を与えてはなりません。 キューのさらなる分割 ビジネスシナリオに基づいて大まかな区分を行った後、特定のシナリオではさらに詳細な区分が必要になる場合があります。たとえば、アップストリームにプッシュする場合、1 つのアップストリームのブロックが他のアップストリームへのプッシュに影響するのを避けるために、異なるアップストリームが互いに影響を及ぼさないようにする必要があります。したがって、アップストリームごとに異なるキューを使用する必要があります。例:
CLIENT_CELERY_ROUTES では、クライアントに応じて分離する必要があるタスクと対応するキュー名の形式が指定されます。キュー名には、クライアントごとに異なるキュー名を取得するためのプレースホルダーが含まれています。 次に、ルーター ClientRouter が実装され、タスクに対応するキュー名を指定するために使用される router_for_task メソッドが定義されます。タスクが CLIENT_CELERY_ROUTES にある場合、キュー名は kwargs の client_id を使用してフォーマットされ、メッセージが最終的に送信されるキューの名前が取得され、入力パラメータ client_id に基づいて使用する特定のキューが決定され、異なるクライアントが異なるキューを使用することがないように分離されるというロジックであることがわかります。 クライアント ディメンションに基づいてキューを分割することに加えて、分離を実現するために他のディメンションに基づいてキューをさらに分割する必要がある場合は、この方法を参照してルーティング ルールを設計することもできます。 動的キュー 動的キューについてお話しましょう。それらは本質的には予備キューです。その目的は、オンライン環境内の特定のキューにメッセージが蓄積される圧力を軽減し、迅速なサポートを提供することです。構成を通じて、動的キューがサポートする必要があるキューを定義します。たとえば、プッシュ キューに大きな負荷がかかっている場合は、次のように json を構成して、push_tracking タスクと push_weight タスクを準備された動的キューにルーティングできます。
上記の構成では、celery_task.push_tracking タスクの 70% が動的キュー 1 と 2 にルーティングされ、celery_task.push_weight タスクの 70% が動的キュー 3 と 4 にルーティングされます。 動的キュー ルーター DynamicRouter は、おおよそ次のように実装されます。
動的に構成されたスケジュールされたタスク 前述のように、Celery は非同期タスクを実装できるだけでなく、Celery Beat を通じてスケジュールされたタスクも実装できます。まずは例を見てみましょう:
上記の設定が完了したら、Celery Beat コマンドを実行します。 セロリビート つまり、設定に応じて、send_email タスクは 30 秒ごとに実行されます。 上記の例では、コード内でスケジュールされたタスクを構成します。私の作業では、djcelery が提供するデータベース スケジューリング モデルを使用しましたが、これは Django が提供する ORM 機能と組み合わせることで動的に設定でき、より便利です。やり方は次のとおりです。まず、Celery 設定に以下を追加します。
DatabaseScheduler の使用を設定し、スケジュールされたタスクの構成テーブルを生成します。
次のテーブルがデータベースに追加されたことがわかります。
上記の操作を完了したら、Celery Beat コマンドを実行するだけで、データベースから構成が読み取られ、スケジュールされたタスクが開始されます。これの利点は、タスク サイクルやパラメータを調整するなど、データベース内のレコードを変更することで、スケジュールされたタスクを動的に構成できることです。 上記は、私が仕事でCeleryを使った経験から学んだことです。非同期タスクまたはスケジュールされたタスクを実装する必要がある場合は、Celery の使用を検討してください。 私はテクノロジーと人生を愛するソウギョのCao Nieziです。また次回お会いしましょう! 参照する メッセージ キューとタスク キューの違い (https://newbedev.com/message-queue-vs-task-queue-difference) 高性能非同期フレームワーク Celery のガイド (https://juejin.cn/post/6844903689103081480) 分散タスク キュー Celery - 詳細なタスク (https://www.cnblogs.com/jmilkfan-fanguiju/p/10589779.html) |
<<: Jiuzhou Cloudは、最も有望なエッジコンピューティング企業として「Golden Edge Award」を受賞しました。
>>: パブリッククラウドのセキュリティについてお話ししましょう
Leshan Onlineの運営を始める前に、私は比較的詳細な調査を行いました。人口数百万人の楽山市...
1. アリババがUCWebを完全買収したとの噂北京時間6月11日朝のニュース、米国のテクノロジーサイ...
文/王静5月30日、広州オプティマスプライムネットワークテクノロジー株式会社(以下、「オプティマスプ...
tranzmediaはインドのIT企業で、2005年に事業を開始したと言われていますが、具体的な情報...
企業はクラウド コンピューティングの利点だけを考慮するべきではありません。クラウド コンピューティン...
昨日(4月29日)、ジョインタウンは2013年度の年次報告書を発表し、テンセントとの数か月にわたる提...
電子商取引の発展に伴い、中国のビジネス分野は徐々に「有形」から「無形」へと移行しています。インターネ...
ほとんどすべての企業のウェブサイト管理者やSEO担当者は、オリジナルコンテンツの作成や外部リンクの宣...
SEO 担当者の皆さん、実は私たち SEO 担当者にとって、記事を書いたりウェブサイトを更新したりす...
[[249686]]自然の季節に合わせて、TMT 業界全体が急速に寒い冬に向かっています。プライマリ...
検索エンジンの大幅な拡大に伴い、キーワードの役割はますます重要になってきました。人間の社会生活のペー...
まず、プロモーションを行うには、Baiduプロモーションの基礎知識を理解する必要があります。 1. ...
PieLayerは創業4年の歴史を持ち、現在は米国ロサンゼルス、ニューヨーク、カンザス、ドイツフラン...
これまで、ウェブサイトの最適化は、通常、プロモーションや外部リンクの公開と呼ばれるオフサイト最適化に...
4月15日、海外メディアの報道によると、新浪微博の株価は取引初日に19%急騰し、終値は20.24ドル...