pull キューの Pub/Sub への移行(Python)

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

アプリで pull キューと push キューの両方を使用する場合は、このガイドに従って、pull キューを Pub/Sub に移行してから push キューを新しい push キューサービス 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 リクエストの割り当てに影響する場合があります。

移行前

まだ設定していない場合は、Python 開発環境を設定して、Google Cloud と互換性のある Python バージョンを使用し、独立した Python 環境を作成するためのテストツールをインストールします。

以降のセクションでは、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

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

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

  1. app.yaml ファイルを更新します。Python のバージョンに応じた手順に沿って操作します。

    Python 2

    Python 2 アプリの場合は、最新バージョンの grpcio ライブラリを追加します。

    app.yaml ファイルの例を次に示します。

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    

    Python 3

    Python 3 アプリの場合は、app.yaml ファイルの runtime 要素に、サポートされている Python 3 バージョンを指定します。次に例を示します。

    runtime: python310 # or another support version
    

    Python 3 ランタイムでは、ライブラリが自動的にインストールされるため、以前の Python 2 ランタイムの組み込みライブラリを指定する必要はありません。移行時に Python 3 アプリが他の以前のバンドル サービスを使用している場合は、引き続き必要な組み込みライブラリを指定できます。それ以外の場合は、app.yaml ファイル内の不要な行を削除してください。

  2. requirements.txt ファイルを更新します。Python のバージョンに応じた手順に沿って操作します。

    Python 2

    Pub/Sub 用の Cloud クライアント ライブラリを requirements.txt ファイルの依存関係のリストに追加します。

    google-cloud-pubsub
    

    次に、pip install -t lib -r requirements.txt を実行して、アプリで使用可能なライブラリのリストを更新します。

    Python 3

    Pub/Sub 用の Cloud クライアント ライブラリを requirements.txt ファイルの依存関係のリストに追加します。

    google-cloud-pubsub
    

    Python 3 ランタイムにアプリをデプロイするときに、App Engine によってこれらの依存関係が自動的にインストールされるため、lib フォルダが存在する場合は削除します。

  3. Python 2 アプリで組み込みライブラリまたはコピーされたライブラリを使用している場合、そのパスを app.yaml ファイルと同じフォルダにある 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')
    
  4. Task Queues API から pull キューを使用するファイルに Pub/Sub Python クライアント ライブラリをインポートします。

    from google.cloud import pubsub

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 への参照を削除します。

次のステップ