Fork me on GitHub

タスクキュー

タスクキューは通常のHTTPリクエスト/レスポンスのサイクルの外側で実行されるバックグラウンド処理を管理します。

なぜタスクキューは必要?

HTTPリクエストをきっかけに行われない、またはHTTPレスポンスを返す際のパフォーマンスを著しく低下させる恐れのある処理は非同期で扱います。

例えば、Webアプリケーションは10分毎にGitHub APIからスターが多い順に100個のレポジトリを取得しているとします。タスクキューを使ってGitHub APIの呼び出しを管理し、APIのレスポンスを処理してデータベースに保存しておきます。

他の例として、HTTPリクエスト/レスポンスのサイクルの中でデータベースへのクエリに時間がかかりすぎている場合を挙げましょう。クエリをバックグラウンドで一定時間ごとに実行し、データベースに保存することもできるでしょう。HTTPリクエストが来たら、時間のかかるクエリを発行する代わりに、事前にデータベースに保存した結果を取得するようにします。タスクキューでキャッシング のよう形式で事前に処理しておくことができます。

タスクキューでは以下の様な事もできます。

  • データベースへのデータの挿入を一度に全て行わずに、時間をかけて複数の独立したデータベースに行う。

  • 15分毎など、一定間隔でデータの集計を行う。

  • バッチ処理のような、一定の時間に行う処理をスケジュールする。

タスクキューのプロジェクト

PythonでのタスクキューのデファクトスタンダードはCeleryです。他のタスクキュープロジェクトは、Celeryが単純な用途に使うには複雑すぎるという観点から開発されている傾向があります。著者はCeleryの使い方を時間をかけて学ぶことをお勧めします。

  • The Celeryは非同期タスクとスケジューリングを扱うための、最も利用されているPythonライブラリです。
  • The RQ (Redis Queue)はジョブをキューイングしたり、バックグラウンドで処理を行うためのシンプルなPythonライブラリです。Redisがベースになっていて、入門の敷居も低くなっています。イントロダクションはRQの使い方と設計に関する説明がされています。
  • Taskmasterは一度だけ行われる巨大なタスクを管理するための軽量でシンプルなタスクキューライブラリです。

メッセージキューとタスクキューのホスティングサービス

サードパーティのタスクキューサービスは、タスクキューのデプロイを大規模にスケールアウトする際に生じる複雑な問題を回避します。

  • Iron.ioはCeleryを含めた様々なタスクキューシステムをサポートしているメッセージングサービスプラットフォームです。Amazon Web ServiceやHerokuなど、他のIaaSやPaaSと連携することもできます。
  • CloudAMQPはRabbitMQが利用できるサーバを管理するのが本来のサービスです。自分のサーバでRabbitMQを使いたいが、インストールや管理が面倒という場合に利用することができます。

タスクキューを学ぶためのリソース

  • Queues.ioはタスクキューシステムの一覧とその概要を見ることができます。Pythonで利用できるもの以外のシステムもリストされていますが、Pythonで利用できるものは"Python"というキーワードでタグ付けされています。
  • Why Task Queuesはタスクキューとは何なのか、そしてなぜ必要なのかを説明しているプレゼンテーションです。
  • Celery - Best Practicesでは、Celeryでやってはいけないこと、タスクキューを簡単に活用するための方法が紹介されています。
  • Cuktus GruopのブログのCelery in ProductionはCeleryとRabbitMQを利用した体験を基にした、監視ツールや他のドキュメントでは触れられることが少ない話題について言及している記事です。
  • Herokuはsecure Celeryで、暗号化されていないネットワークでタスクを送信する際のCeleryをセキュアに運用する方法を解説しています。

タスクキューを学ぶためのチェックリスト

あなたのWebアプリケーションの中で、HTTPリクエストに対する処理が遅い関数を探してください。

HTTPリクエストを受け取った際に処理を始める代わりに、一定間隔で事前に処理ができるかを検討します。できるのであれば、他の場所から呼び出し可能な別の関数を書いて、データベースに前もって処理結果を格納しておきましょう。

Celeryのドキュメントを読み、どのように利用できるのかを上記のリソースから学びましょう。

RabbitMQやRedisのようなメッセージブローカーをインストールし、Celeryを導入してみましょう。インストールしたメッセージブローカーとCeleryが動作するように設定してみましょう。

最初のステップとしてCeleryで関数を実行してみましょう。

HTTPリクエストを受け取る関数で事前に処理されたデータを利用するようにしてみましょう。

タスクキューの次は?

Webアプリケーションとタスクキューのログを監視する方法は?

アクセス解析をすることで、ユーザの何を学ぶことができますか?

運用中のWebアプリケーションをモニタリングするツールはありますか?


Interested in a complete Full Stack Python book with detailed tutorials and example code? Sign up here and you'll get an alert email if a book is created. No other emails will be sent other than sign up confirmation.