pull キューの Pub/Sub への移行

このページでは、タスクキューから Pub/Sub に pull キューコードを移行する方法について説明します。App Engine で pull キューの処理を実行する場合、現時点では Pub/Sub がおすすめの方法です。

アプリで pull キューと push キューの両方を使用する場合は、このガイドに従って、pull キューを Pub/Sub に移行してから push キューを新しい pull キューサービス Cloud Tasks に移行します。push キューを Cloud Tasks に移行した後に pull キューを移行することはおすすめしません。queue.yaml ファイルを使用することにより Cloud Tasks で予期しない動作が発生する可能性があるためです。

Pub/Sub で現在利用できない機能

次のタスクキューの機能は、現在、Pub/Sub で使用できません。

  • タグによるバッチ処理
  • 自動重複除去

料金と割り当て

pull キューを Pub/Sub に移行すると、アプリの料金と割り当てに影響する場合があります。

料金

Pub/Sub には独自の料金が適用されます。タスクキューと同様に、App Engine アプリに Pub/Sub を使用してリクエストを送信するとアプリに費用がかかることがあります。

割り当て

Pub/Sub の割り当ては、タスクキューの割り当てとは異なります。タスクキューと同様に、Pub/Sub から App Engine アプリにリクエストを送信すると、App Engine リクエストの割り当てに影響する場合があります。

移行前

このセクションでは、pull キューを Pub/Sub に移行する前に確認する必要があるトピックについて説明します。

Pub/Sub API の有効化

Pub/Sub API を有効にするには、API ライブラリの [Pub/Sub API] で [有効にする] をクリックします。[有効にする] ボタンの代わりに [管理] ボタンが表示されている場合は、以前にプロジェクトの Pub/Sub API を有効にしているため、再び有効にする必要はありません。

Pub/Sub API に対するアプリの認証

Pub/Sub API に対してアプリを認証する必要があります。このセクションでは、2 つの異なるユースケースの認証について説明します。

アプリをローカルで開発またはテストするには、サービス アカウントを使用することをおすすめします。サービス アカウントを設定してアプリに接続する手順については、サービス アカウントの資格情報を手動で取得して提供するをご覧ください。

アプリを App Engine にデプロイする場合、新しい認証を行う必要はありません。アプリケーションのデフォルト認証情報(ADC)では、App Engine アプリの認証の詳細が推測されます。

Google Cloud CLI のダウンロード

まだインストールしていない場合は、Google Cloud CLI をダウンロードしてインストールし、Pub/Sub API で gcloud CLI を使用します。Google Cloud CLI がすでにインストールされている場合は、ターミナルから次のコマンドを実行します。

gcloud components update

Python クライアント ライブラリのインポート

App Engine アプリで Pub/Sub Python クライアント ライブラリを使用する手順は次のとおりです。

  1. サードパーティ ライブラリの保存先ディレクトリ(例: lib/)を作成します。

    mkdir lib
  2. 必要なライブラリをコピーします。

    コマンドラインからライブラリを 1 つずつインストールするのではなく、pip 要件ファイルを使用することをおすすめします。まだ requirements.txt ファイルが作成されていない場合は、app.yaml ファイルと同じフォルダに requirements.txt ファイルを作成します。次の行を追加します。

    google-cloud-pubsub
    

    pip(バージョン 6 以降)を -t <directory> フラグを指定して使用して、requirements.txt ファイルに指定した Pub/Sub ライブラリを、前の手順で作成したフォルダにコピーします。例:

    pip install -t lib -r requirements.txt
    
  3. app.yaml ファイルの libraries セクションで RPC ライブラリを指定します。

    libraries:
    - name: grpcio
      version: 1.0.0
    
  4. pkg_resources モジュールを使用して、アプリが Pub/Sub Python クライアント ライブラリの適切なディストリビューションを使用するようにします。

    まだ作成されていない場合は、app.yaml ファイルと同じフォルダに appengine_config.py ファイルを作成します。次のコードを appengine_config.py ファイルに追加します。

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    この例の appengine_config.py ファイルでは、現在の作業ディレクトリが lib フォルダの置かれているディレクトリであるものと想定しています。単体テストなどの一部のケースでは、現在の作業ディレクトリはこれとは異なる場合があります。エラーが発生しないようにするために、lib フォルダのフルパスを次のようにして明示的に指定できます。

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    
  5. タスクキュー API から pull キューを使用するファイルに Pub/Sub Python クライアント ライブラリをインポートします。

    from google.cloud import pubsub_v1

Pub/Sub キューと pull キュー

機能の比較

Pub/Sub は、パブリッシャー / サブスクライバーの関係を通じてワーカーに作業を送信します。Pub/Sub の pull サブスクリプションは、サブスクライバーがトピックからメッセージを pull するため、タスクキューの pull キューと似ています。タスクキューの pull キューのコア機能と、Pub/Sub の pull サブスクリプションの関連機能を次の表に示します。

タスクキューの機能 Pub/Sub の機能
キュー トピック
タスク メッセージ
ワーカー サブスクライバー

Pub/Sub アーキテクチャの詳細については、Cloud Pub/Sub: Google 規模のメッセージ サービスをご覧ください。

ワークフローの比較

タスクキューの pull キューと Pub/Sub の pull サブスクリプションの一般的なワークフローの比較を次の表に示します。

タスクキューのワークフロー Pub/Sub のワークフロー
pull キューを作成する トピックを作成し、サブスクライバー(ワーカー)をトピックに登録する
タスクを作成してキューに追加する メッセージを作成してトピックに公開する
ワーカーがタスクをリースする サブスクライバーがトピックからメッセージを pull する
ワーカーがタスクを処理する サブスクライバーがメッセージを処理する
ワーカーがタスクをキューから削除する サブスクライバーがメッセージを確認応答します
リースが期限切れになる すべてのサブスクライバーがメッセージを確認応答すると、トピックでメッセージが削除される

Pub/Sub での pull サブスクリプションの作成

Pub/Sub の pull サブスクリプションは、タスクキューの pull キューのように使用できます。トピックのサブスクリプションには有効期限がなく、複数のワーカーに同時に存在することもあります。これは、複数のワーカーが 1 つのメッセージを処理できることを意味します。これは、Pub/Sub の主なユースケースの 1 つです。タスクキューの pull キューを Pub/Sub の pull サブスクリプションとして再作成するには、各ワーカーにトピックを作成し、関連するワーカーのみをトピックに登録します。これにより、タスクキューのように各メッセージが 1 名のワーカーによってのみ処理されるようになります。pull サブスクリプションの作成と管理の詳細については、トピックとサブスクリプションの管理をご覧ください。

pull キューの削除

タスクキューの pull キューを Pub/Sub の pull サブスクリプションに移行した後に、queue.yaml ファイルを使用してタスクキューから pull キューを削除します。各 pull キューを削除してから、次のキューを移行することをおすすめします。これにより、他の pull キューの移行時に、アプリが新しい Pub/Sub の pull サブスクリプションから受け取った作業を複製しなくなります。タスクキューの pull キューを単一のデプロイで削除せずに 1 つずつ削除すると、App Engine ののデプロイ割り当てに大きな影響を与える可能性があるので注意してください。

タスクキューからすべての pull キューを削除した後は、アプリの今後のデプロイで queue.yaml ファイルを省略できます。

アプリで pull キューのみを使用する場合は、コード内のタスクキュー API への参照をすべて削除します。アプリで pull キューと push キューの両方を使用する場合は、pull キューのみを使用するファイルで発生するタスクキュー API への参照を削除するか、push キューを移行するまで待機して、すべてのファイルからタスクキュー API への参照を削除します。

次のステップ