將提取佇列遷移至 Pub/Sub (Python)

本頁說明如何將提取佇列程式碼從工作佇列遷移至 Pub/Sub。在 App Engine 中執行提取佇列工作時,建議使用 Pub/Sub。

如果您的應用程式同時使用提取佇列和推送佇列,請先按照本指南將提取佇列遷移至 Pub/Sub,再將推送佇列遷移至新的推送佇列服務 Cloud Tasks。不建議在將發送佇列遷移至 Cloud Tasks 後,再遷移提取佇列,因為必須使用 queue.yaml 檔案可能會導致 Cloud Tasks 出現意外行為。

Pub/Sub 目前無法使用的功能

下列工作佇列功能目前無法在 Pub/Sub 中使用:

  • 依標記批次處理
  • 自動去重

定價與配額

將提取佇列遷移至 Pub/Sub 可能會影響應用程式的價格和配額。

定價

Pub/Sub 有專屬的定價方案。與工作佇列一樣,使用 Pub/Sub 將要求傳送至 App Engine 應用程式,可能會導致應用程式產生費用。

配額

Pub/Sub 配額與工作佇列的配額不同。與工作佇列一樣,從 Pub/Sub 將要求傳送至 App Engine 應用程式,可能會影響 App Engine 要求配額

遷移前

如果您尚未設定 Python 開發環境,請使用與 Google Cloud相容的 Python 版本,並安裝測試工具來建立隔離的 Python 環境。

以下各節將說明將拉取佇列遷移至 Pub/Sub 之前的設定步驟。

啟用 Pub/Sub API

如要啟用 Pub/Sub API,請在 API 程式庫中,按一下 Pub/Sub API 上的「啟用」。如果您看到「管理」按鈕,而非「啟用」按鈕,表示您之前已為專案啟用 Pub/Sub API,因此不需要再執行這項操作。

讓應用程式通過 Pub/Sub API 驗證

您必須向 Pub/Sub API 驗證應用程式。本節將討論兩種不同用途的驗證方式。

如要在本機開發或測試應用程式,建議您使用服務帳戶。如需設定服務帳戶並將其連結至應用程式的操作說明,請參閱「手動取得及提供服務帳戶憑證」。

如要在 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 檔案中使用支援的 Python 3 版本指定 runtime 元素。例如:

    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 應用程式,如果應用程式使用內建或複製的程式庫,您必須在 appengine_config.py 檔案中指定這些路徑,該檔案位於與 app.yaml 檔案相同的資料夾中:

    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 的拉取佇列檔案中,匯入 Pub/Sub Python 用戶端程式庫:

    from google.cloud import pubsub

Pub/Sub 和提取佇列

功能比較

Pub/Sub 會透過發布端/訂閱端關係將工作傳送至 worker。Pub/Sub 中的提取訂閱項目類似於工作佇列中的提取佇列,因為訂閱端會從主題提取訊息。下表列出工作佇列中提取佇列的核心功能,以及 Pub/Sub 中提取訂閱項目的相關功能。

工作佇列功能 Pub/Sub 功能
佇列 主題
工作 訊息
工作站 訂閱端

如要進一步瞭解 Pub/Sub 架構,請參閱「Cloud Pub/Sub:Google 規模的訊息傳遞服務」。

工作流程比較

以下比較工作佇列中提取佇列的典型工作流程,以及 Pub/Sub 中的提取訂閱項目

工作佇列工作流程 Pub/Sub 工作流程
您建立提取佇列 您建立主題,並讓訂閱者 (即 worker) 訂閱該主題
您建立並將工作加入佇列 您建立訊息並將其發布至主題
工作站租用工作 訂閱者從主題中提取訊息
工作站處理工作 訂閱端處理訊息
工作站從佇列中刪除工作 訂閱者確認收到訊息
租約到期 當所有訂閱者都已確認訊息時,主題會刪除該訊息

在 Pub/Sub 中建立提取訂閱

您可以使用 Pub/Sub 提取訂閱,就像使用工作佇列提取佇列一樣。主題訂閱不會過期,且可同時存在於多個 worker。也就是說,一則訊息可以由多個 worker 處理,這是 Pub/Sub 的主要用途之一。如要重新建立 Task Queues 拉取佇列做為 Pub/Sub 拉取訂閱,請為每個 worker 建立主題,並只將相關聯的 worker 訂閱至主題。這可確保每則訊息都由一個工作站處理,就像工作佇列一樣。如要瞭解如何建立及管理拉取訂閱,請參閱管理主題和訂閱項目

刪除提取佇列

將工作佇列提取佇列遷移至 Pub/Sub 提取訂閱後,請使用 queue.yaml 檔案從工作佇列中刪除這些佇列。建議您先刪除每個拉取佇列,再遷移下一個佇列。這樣一來,您就能避免應用程式在遷移其他拉取佇列時,重複執行從新的 Pub/Sub 拉取訂閱項目收到的工作。請注意,如果刪除 Task Queues 提取佇列,而非在單一部署作業中刪除,可能會對 App Engine 部署配額造成更大的影響。

從工作佇列中刪除所有拉取佇列後,您可以在日後的應用程式部署中省略 queue.yaml 檔案。

如果您的應用程式只使用提取佇列,請在程式碼中移除任何 Task Queues API 參照。如果應用程式同時使用提取佇列和推送佇列,您可以移除只使用提取佇列的檔案中 Task Queues API 的參照,或是等到推送佇列遷移完成後,再從所有檔案中移除 Task Queues API 的參照。

後續步驟