풀 정기 결제로 RBM 에이전트 개발 속도를 높이는 방법

RBM 상담사는 Google Cloud Pub/Sub과의 게시/구독 관계를 통해 메시지와 이벤트를 수신합니다. 사용자가 에이전트의 메시지에 응답하면 RBM 플랫폼은 이러한 메시지를 에이전트만 액세스할 수 있는 고유한 Pub/Sub 주제에 게시합니다. 에이전트는 고유한 주제에 대한 구독을 통해 이러한 메시지와 이벤트에 액세스합니다.

Pub/Sub는 푸시이라는 두 가지 유형의 구독을 지원합니다. 푸시 구독을 사용하면 Cloud Pub/Sub가 사용자가 구성한 웹훅 URL로 메시지를 전송합니다. 풀 정기 결제를 사용하는 경우 코드를 작성하여 장기 실행 메시지 리스너를 만들고 수신 시 메시지를 확인해야 합니다.

대부분의 개발자에게 더 익숙하고 인기 있는 접근 방식은 푸시 구독입니다. 서드 파티 API를 사용해 보았다면 콜백/웹훅 URL을 사용해 보았을 것입니다. 이 방법은 간단하지만 공개적으로 사용할 수 있는 URL이 필요하므로 개발자가 변경사항을 테스트할 때마다 공개 웹 서버에 배포해야 합니다.

이 도움말에서는 로컬 테스트를 위해 pull 구독을 설정하는 방법과 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 구성 및 배포

프로덕션 환경에서는 정기 결제를 항상 사용할 수 있는지 확인해야 합니다. 간단한 방법 중 하나는 크론 작업을 사용하여 Pub/Sub 메시지 리스너를 주기적으로 다시 초기화하는 것입니다.

App Engine에서 크론 작업은 서로 다른 간격으로 작업을 예약하는 데 사용할 수 있습니다. 크론 작업은 설명, URL, 간격으로 구성됩니다. Node.js 앱에서는 cron.yaml 파일로 이를 구성하고 Google Cloud SDK를 사용하여 App Engine에 배포할 수 있습니다. cron.yaml로 작업 예약에서 다른 언어 구성 설정에 대해 알아볼 수 있습니다.

크론 작업에는 URL이 필요하므로 크론에서 호출할 익스프레스 앱 라우터에 URL 엔드포인트를 추가해야 합니다. 그러면 이전 섹션에서 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();
});

또한 콜백 내에서 예약된 작업을 다시 실행하기 전에 리스너를 삭제해야 합니다. 예를 들어 크론 작업이 1분마다 실행되는 경우 CRON_JOB_TIMEOUT 매개변수를 60와 같게 구성합니다.

다음은 이 엔드포인트를 1분마다 실행하는 cron.yaml 파일 구성입니다.

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

App Engine에 크론 태스크를 배포하려면 다음을 실행합니다.

gcloud app deploy cron.yaml

배포 후에는 App Engine에서 크론 작업을 자동으로 구성하며, 아래와 같이 App Engine > Cron 작업에서 해당 작업이 표시됩니다.

크론 작업 구성됨

요약 및 요약

풀 구독을 사용하면 로컬에서 테스트 및 디버그할 수 있으므로 개발 주기 속도를 높이고 RBM 에이전트를 만드는 데 걸리는 시간을 줄일 수 있습니다. 가져오기 모델에는 내보내기 모델보다 추가 구성과 코드가 필요하지만 설정은 간단하며 한 번만 구성하면 됩니다. 크론 작업은 가져오기 구독이 항상 에이전트의 메시지 흐름을 처리할 수 있도록 하는 쉬운 방법이며 App Engine은 설정 및 유지보수 비용이 매우 적게 듭니다.

행운을 빕니다.