push キューの作成

このページでは、push キューの作成とカスタマイズ、キューのコンテンツの確認を行う方法について説明します。

queue.xml を使用してキューを作成する

タスクを処理するには、タスクを push キューに追加する必要があります。App Engine には、default という名前のデフォルトの push キューが用意されています。これは、デフォルト設定ですぐに使用できるように構成されています。すべてのタスクをこのデフォルト キューに追加するだけで、これを使用できます。他のキューを作成して設定する必要はありません。

キューを追加する、またはデフォルトの設定を変更する場合は、アプリケーションの queue.xml ファイルに変更を加え、App Engine にアップロードします。無料アプリケーションでは最大 10 個のキューを作成でき、課金対応アプリケーションでは最大 100 個のキューを作成できます。キューを動的に作成することはできません。

次の queue.xml ファイルでは、2 つのキューを定義しています。

<?xml version="1.0" encoding="UTF-8"?>
  <queue-entries>
    <queue>
      <name>queue-blue</name>
      <target>v2.task-module</target>
    </queue>
    <queue>
      <name>queue-red</name>
      <rate>1/s</rate>
    </queue>
  </queue-entries>
App Engine SDK を使用してファイルをアップロードします。

Mac / Linux

[PATH_TO_APP_ENGINE_SDK]\bin\appcfg.sh update [YOUR_APP_DIR]

Windows

[PATH_TO_APP_ENGINE_SDK]\bin\appcfg.cmd update [YOUR_APP_DIR]

queue-blue に追加されたタスクはすべてターゲット モジュール v2.task-module に送信されます。queue-red の更新間隔は 5 回/秒から 1 回/秒に変更されます。1 秒間に 1 タスクの割合でタスクがキューからターゲットに送信されます。

キューを削除した後に同じ名前で新しいキューを作成する場合は、およそ 7 日間待つ必要があります。

この他にも、queue.xml ファイルに追加して push キューの動作をカスタマイズできるパラメータが多数あります。詳細は、queue.xml のリファレンスをご覧ください。

push キューの処理速度を定義する

<rate><bucket-size><max-concurrent-requests> などのその他のディレクティブを定義することで、キューごとにタスクの処理速度を制御できます。

タスクキューでは、トークン バケットを使用して、タスク実行のレートを制御します。指定された各キューにはトークンを保持するトークン バケットがあり、bucket_size で指定された最大サイズまで、またはバケットサイズを指定していない場合は最大で 5 個までトークンを保持できます。

アプリケーションでタスクが実行されるたびに、バケットからトークンが 1 つ削除されます。キューのバケットにトークンがなくなるまで、アプリはそのキューにあるタスクの処理を続けます。キューに指定した <rate> に基づいて、App Engine からバケットに新しいトークンが続けて補充されます。

処理対象のタスクがキューにあって、そのキューのバケットにトークンがある場合、App Engine はトークンと同じ数のタスクを同時に処理します。その結果、処理量の急増によってシステム リソースが消費され、ユーザー リクエストの処理とリソースの競合が発生する可能性があります。

多数のタスクが一度に実行されないようにしたりデータストアの競合を防いだりするには、<max-concurrent-requests> を使用します。

以下の例では、<max-concurrent-requests> を設定してタスクを制限する方法を示しています。また、アプリケーションの要件と使用可能なリソースに基づいてバケットサイズとレートを調整する方法も示しています。

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <queue>
    <name>queue-blue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

すべてのキューに保存容量の上限を設定する

queue.xml では、すべてのキューでタスクデータに使用できる合計保存容量を定義できます。合計保存容量の上限を定義するには、トップレベルに <total-storage-limit> という名前の要素を指定します。

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <total-storage-limit>120M</total-storage-limit>
  <queue>
    <name>queue-blue</name>
    <rate>35/s</rate>
  </queue>
</queue-entries>

この値には、数値に続けて単位を指定します。単位は、バイトの場合は 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 個以下になるように処理速度が調整されます。

<?xml version="1.0" encoding="utf-8"?>
<queue-entries>
  <queue>
    <name>optimize-queue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

GCP Console でのキューの監視

GCP Console の [タスクキュー] ページにアプリケーション内のすべてのタスクキューに関する情報が表示されます。

  1. GCP Console の [タスクキュー] ページにアクセスし、そのページの上部にあるメニューバーの [push キュー] タブを選択します。

    [push キュー] タブに移動

  2. [push キュー] タブに、アプリケーションのキューがすべて表示されます。キュー名をクリックすると、[タスクキューの詳細] ページが開き、選択したキュー内のタスクがすべて表示されます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java の App Engine スタンダード環境