如何透過提取訂閱項目加快 RBM 代理程式的開發速度

RBM 代理程式透過 Google Cloud Pub/Sub 的發布/訂閱關係接收訊息和事件。使用者回應服務專員的訊息時,RBM 平台會將這些訊息發布至不重複的 Pub/Sub 主題,但這些服務專員只有你可存取。您的代理程式會透過訂閱項目,從自己專屬的主題存取這些訊息和事件。

Pub/Sub 支援兩種訂閱項目:pushpull。使用推送訂閱項目時,Cloud Pub/Sub 會傳送訊息到您設定的 Webhook 網址。使用提取訂閱時,您必須負責編寫程式碼來建立長時間執行的訊息監聽器,並在收到訊息時加以確認。

大部分開發人員最熟悉且受歡迎的方法就是推送訂閱項目。如果您使用第三方 API,您很可能已採用回呼/Webhook 網址。雖然這個做法相當簡單,但需要公開的公開網址,因此每次開發人員都必須測試變更,才能部署至公開網路伺服器。

在本文中,我們會說明如何設定提取訂閱項目進行本機測試,以及如何在 Google Cloud App Engine 的實際工作環境中使用這個訂閱項目。

設定提取訂閱項目的 Pub/Sub

如果您尚未為代理程式設定 Pub/Sub,請按照 Cloud Pub/Sub 中的操作說明建立初始訂閱項目。

建立訂閱項目後,只要從推送模式切換至提取模型,即可輕鬆完成。前往 Google Cloud Console,然後依序點選「Pub/Sub」>「訂閱」部分。找到您為服務專員建立的訂閱,按一下旁邊的溢位選單,然後選取「編輯」。畫面會顯示類似下圖的設定畫面。

訂閱項目詳細資料

將「傳送類型」設為「提取」,然後按一下「儲存」

設定非同步提取訂閱項目處理常式

接下來,你必須更新 RBM 代理程式,才能從訂閱項目提取訊息。您可以參閱非同步提取,瞭解如何利用多種程式設計語言完成這項操作,或是查看一些 RBM 代理程式範例,其中有許多使用提取模型。

以下程式碼示範如何在 Node.js 中設定非同步提取事件監聽器:

function initPubsub() {
    let pubsub = new PubSub({
        projectId: REPLACE_WITH_GCP_PROJECT_ID,
        keyFilename: REPLACE_WITH_SERVICE_ACCOUNT_KEY_FILE_LOCATION,
    });

    // references an existing subscription, (e.g. rbm-agent-sub)
    let subscription = pubsub.subscription(PUB_SUB_SUBSCRIPTION_NAME);

    // create an event handler to handle messages
    let messageHandler = (message) => {
        console.log(`Received message ${message.id}:`);
        console.log(`\tData: ${message.data}`);
        console.log(`\tAttributes: ${message.attributes}`);

        let userEvent = JSON.parse(message.data);

        // TODO: process the userEvent to create another RBM message
        // "Ack" (acknowledge receipt of) the message
        message.ack();
    };

    // Listen for new messages
    subscription.on('message', messageHandler);

    return { messageHandler: messageHandler, subscription: subscription };
}

如要在本機測試代理程式,只要在快遞應用程式啟動時呼叫 initPubsub,即可從主控台中看到 messageHandler 的列印回應。

設定及部署至 Google 的 App Engine

在實際工作環境中,您必須確保訂閱項目隨時可供使用。其中一個簡單的方法是,透過 Cron 工作定期重新初始化 Pub/Sub 訊息事件監聽器。

在 App Engine 中,Cron 工作可用來按照不同的時間間隔安排工作。Cron 工作是以說明、網址和時間間隔設定。在 Node.js 應用程式中,您可以在 cron.yaml 檔案中進行設定,您可以使用 Google Cloud SDK 部署至 App Engine。如要進一步瞭解其他語言的設定,請參閱使用 cron.yaml 安排工作

Cron 工作需要網址,因此您必須將網址端點新增至 cron 呼叫的 Express 應用程式路由器,接著才能啟動上一節的 initPubsub 方法以啟動事件監聽器。

router.get('/pubsubCallback', function(req, res, next) {
  let pubsubConfig = initPubsub();

      // Stop listening once the timeout is hit
      setTimeout(() => {
        pubsubConfig.subscription.removeListener('message', pubsubConfig.messageHandler);
      }, CRON_JOB_TIMEOUT * 1000);

  res.status(200).send();
});

在回呼中,您也必須移除事件監聽器,然後再次執行已排定的工作。舉例來說,如果 Cron 工作每分鐘執行,會將 CRON_JOB_TIMEOUT 參數設為 60

以下是每分鐘執行的這個端點的 cron.yaml 檔案。

cron:
- description: "Processing Pub/Sub messages"
  url: /pubsubCallback
  schedule: every 1 mins

如要將 Cron 工作部署至 App Engine,請執行下列指令:

gcloud app deploy cron.yaml

部署完成後,App Engine 會自動設定 Cron 工作,並在「App Engine」>「Cron tasks」下方查看工作 (如下所示)。

已設定 Cron 工作

總結與總結

使用提取訂閱可讓您在本機測試及偵錯,以加快開發週期,並縮短建立 RBM 代理程式所需的時間。雖然提取模型需要一些額外的設定和程式碼與推送模型,但設定簡單且只需要設定一次。Cron 工作可讓您輕鬆確保提取訂閱項目隨時可供處理代理程式的訊息流程,而 App Engine 能讓設定和維護成本低廉。

祝您一切順利!