このページでは、push キューの作成とカスタマイズ、キューのコンテンツの確認を行う方法について説明します。
キュー構成ファイルを使用してキューを作成する
タスクを処理するには、タスクを push キューに追加する必要があります。App Engine には、default
という名前のデフォルトの push キューが用意されています。これは、デフォルト設定ですぐに使用できるように構成されています。すべてのタスクをこのデフォルト キューに追加するだけで、これを使用できます。他のキューを作成して構成する必要はありません。
キューを追加するか、デフォルトの構成を変更するには、アプリケーションのキュー構成ファイルを編集して App Engine にアップロードします。最大 100 個のキューを作成できます。キューを動的に作成することはできません。
次のキュー構成ファイルは、2 つのキューを定義しています。
queue:
- name: queue-blue
target: v2.task-module
rate: 5/s
- name: queue-red
rate: 1/s
ファイルをアップロードするには:
gcloud app deploy queue.yaml
queue-blue
に追加されたタスクはすべてターゲット モジュール v2.task-module
に送信されます。queue-red
の更新間隔は 5 回/秒から 1 回/秒に変更されます。1 秒間に 1 タスクの割合でタスクがキューからターゲットに送信されます。
キューを削除した後に同じ名前で新しいキューを作成する場合は、7 日間ほど待つ必要があります。
他にも多数のパラメータを構成ファイルに追加して、push キューの動作をカスタマイズできます。詳細については、キュー構成ファイルのリファレンスをご覧ください。
push キューの処理速度を定義する
rate
、bucket_size
、max_concurrent_requests
などのディレクティブを定義すると、各キューでタスクが処理される速度を制御できます。
タスクキューでは、トークン バケットを使用して、タスク実行の速度を制御します。名前付きのキューにはそれぞれ、bucket_size
で指定した数のトークンを保持できるトークン バケットがあります。また、バケットサイズを指定していない場合、保持できるトークン数の最大個数は 5 個になります。
アプリケーションで 1 つのタスクが実行されるたびに、バケットからトークンが 1 つ削除されます。キューのバケットにトークンがなくなるまで、アプリはそのキューにあるタスクの処理を続けます。キューに指定した rate
に基づき、App Engine からバケットに対して新しいトークンが継続的に補充されます。
処理対象のタスクがキューにあって、そのキューのバケットにトークンがある場合、App Engine はトークンと同じ数のタスクを同時に処理します。その結果、処理量の急増によってシステム リソースが消費され、ユーザー リクエストの処理とリソースの競合が発生する可能性があります。
大量のタスクの同時実行やデータストアの競合を防ぐには、max_concurrent_requests
を使用します。
以下の例では、max_concurrent_requests
を設定してタスクを制限しています。また、アプリケーションの要件と使用可能なリソースに基づいて、バケットサイズと速度を調整しています。
queue:
- name: queue-blue
rate: 20/s
bucket_size: 40
max_concurrent_requests: 10
すべてのキューに保存容量の上限を設定する
キュー構成ファイルを使用して、すべてのキューでタスクデータに使用できる保存容量の合計を定義できます。保存容量の合計の上限を定義するには、最上位に total_storage_limit
という名前の要素を追加します。
# Set the total storage limit for all queues to 120MB
total_storage_limit: 120M
queue:
- name: queue-blue
rate: 35/s
この値には、数値に続けて単位を指定します。単位は、バイトの場合は B
、キロバイトの場合は K
、メガバイトの場合は M
、ギガバイトの場合は G
、テラバイトの場合は T
を指定します。たとえば 100K
は 100 キロバイトの上限を表します。タスクを追加するとキューが保存容量の上限を超える場合、タスクを追加する呼び出しは失敗します。無料アプリの場合、デフォルトの上限は 500M
(500 メガバイト)です。有料アプリの場合、上限を明示しないと無制限となります。この制限を使用すると、Fork 爆弾となるプログラミング エラーからアプリを保護できます。このエラーがあると、各タスクが実行中に他の複数のタスクを追加できてしまいます。
タスクを追加するときに割り当ての不足が原因でエラーが発生する場合は、合計保存容量の上限を増やすと解決できることがあります。上限を増やす場合は、数日間相当のタスクに必要な容量に上限を設定することを強くおすすめします。これによって、キューが一時的にバックアップできるようになります。バックログを使用して処理している間に引き続き新しいタスクを受け付けることができる上に、Fork 爆弾のプログラミング エラーからも保護できます。
同時リクエストの最大数を構成する
max_concurrent_requests
を設定して処理速度を制御できます。これにより、同時に実行できるタスクの数が制限されます。
アプリケーションのキューの処理速度が 20 個/秒で、バケットサイズが 40 の場合、そのキュー内のタスクは 20 個/秒の速度で実行されますが、一時的に 40 個/秒まで急増する場合があります。このように設定すると、タスクのレイテンシが比較的短い場合は問題なく動作しますが、レイテンシが大幅に増えた場合は非常に多くの同時タスクを処理することになります。この処理負荷の増加によって余分にインスタンスが消費され、アプリケーションの処理速度が低下します。
たとえば、通常のタスクのレイテンシが 0.3 秒だとします。このレイテンシでは、最大 40 個ほどのタスクを同時に処理することになります。しかし、タスクのレイテンシが 5 秒に増えた場合は、100 個以上のタスクを同時に処理することになる可能性が高くなります。この増加によって、アプリケーションで余分なタスクを処理するためにより多くのインスタンスが消費され、アプリケーション全体の処理速度が低下してユーザー リクエストの処理に支障をきたす可能性があります。max_concurrent_requests
に低い値を設定すると、この問題を回避できる場合があります。
たとえば、max_concurrent_requests
を 10 に設定した場合、このキューの例では、レイテンシが 0.3 秒のときに約 20 タスク/秒が維持されます。レイテンシが増えて 0.5 秒を超えた場合、この設定では、同時に実行されるタスクが 10 個以下になるように処理速度が調整されます。
queue:
# Set the max number of concurrent requests to 50
- name: optimize-queue
rate: 20/s
bucket_size: 40
max_concurrent_requests: 10
Google Cloud コンソールでのキューのモニタリング
Google Cloud コンソールで、[Cloud Tasks] ページに移動します。
App Engine の [タスクキュー] ページに移動すると、[Cloud Tasks] ページへの移動手順が表示されます。この更新を Google Cloud コンソールで行っても、タスクキューの機能は変更されません。
Cloud Tasks API を有効にします。
[Cloud Tasks] ページに移動すると、アプリケーションのすべてのキューが一覧表示されます。キューの名前をクリックすると、[キューの詳細] ページが開き、選択したキュー内のタスクがすべて表示されます。
次のステップ
タスクの作成について確認する。