일대다 Pub/Sub 시스템 빌드

이 튜토리얼에서는 동기 RPC가 아닌 Pub/Sub를 통해 메시지를 전송하는 방법으로 통신하는 애플리케이션 모음을 설정하는 과정을 안내합니다. 애플리케이션을 분리함으로써 메시징은 다음과 같은 효과를 제공합니다.

  • 애플리케이션의 견고성 강화
  • 개발이 간소화될 수 있음

예를 들어 호출자(게시자)는 수신자(구독자)가 현재 실행되어 가용한 상태일 필요가 없습니다. 게시자가 메시지를 Pub/Sub로 전송합니다. 게시자는 어느 구독자 애플리케이션 몇 개가 메시지를 수신해야 하는지 알 필요가 없습니다. 결과적으로, 서비스에 의존해서 하나 이상의 구독자 애플리케이션에 해당 애플리케이션이 가용할 때마다 메시지를 배달할 수 있습니다.

시스템 개요

이 튜토리얼에서는 아래의 다이어그램과 같이 일대다 커뮤니케이션을 사용하여 두 구독자에게 'Hello, World!' 메시지를 전송하는 게시자 애플리케이션을 시작합니다.

주제, 연결된 구독, Cloud Pub/Sub에서 메시지를 송수신하는 게시자 및 구독자 애플리케이션의 다이어그램

두 구독자 애플리케이션은 같은 코드를 사용하지만 서로 다른 시간에 각 애플리케이션을 시작합니다. 이 프로세스는 Pub/Sub가 비동기 통신을 사용하는 방법을 보여줍니다. 이 시스템을 빌드하려면 다음 단계를 완료하세요.

  1. 애플리케이션에서 인증에 사용하는 IAM 서비스 계정을 만듭니다.
  2. IAM 권한을 설정합니다.
  3. Pub/Sub 주제 및 구독을 만듭니다.
  4. 세 개의 독립적인 애플리케이션(게시자 하나, 구독자 둘)을 시작합니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Pub/Sub API:

    gcloud services enable pubsub.googleapis.com
  7. Create local authentication credentials for your user account:

    gcloud auth application-default login
  8. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  9. Install the Google Cloud CLI.
  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Pub/Sub API:

    gcloud services enable pubsub.googleapis.com
  14. Create local authentication credentials for your user account:

    gcloud auth application-default login
  15. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Python 설치

이 튜토리얼에서는 Python 3.7 이상이 필요한 Pub/Sub 클라이언트 라이브러리를 사용합니다. Python 설치 안내를 완료합니다.

Pub/Sub 프로젝트 설정

게시와 구독 애플리케이션 사이의 메시지 흐름을 관리하려면 주제와 두 개의 서로 다른 구독을 만듭니다.

Pub/Sub 주제 만들기

ID가 hello_topic인 주제를 만듭니다.

gcloud pubsub topics create hello_topic

Pub/Sub 구독 만들기

2개의 구독을 만들고 이를 주제에 연결합니다.

이러한 구독은 StreamingPull 구독이며, 이는 가져오기 구독 유형입니다.

구독 1

ID가 sub_one인 구독을 만들고 hello_topic에 연결합니다.

gcloud pubsub subscriptions create sub_one --topic=hello_topic

구독 2

ID가 sub_two인 구독을 만들고 hello_topic에 연결합니다.

gcloud pubsub subscriptions create sub_two --topic=hello_topic

일대다 시스템 빌드

게시자 및 구독자 코드 다운로드

  1. 이 튜토리얼에 필요한 Pub/Sub Python 파일을 다운로드합니다.

     git clone https://github.com/googleapis/python-pubsub.git
  2. 계속 진행하기 전에 열려 있는 터미널을 모두 닫습니다.

3개 터미널 설정

  1. 각 튜토리얼 애플리케이션에 대해 하나의 터미널을 시작합니다(게시자 하나와 구독자 둘). 편의를 위해 이 튜토리얼에서는 다음 터미널을 호출합니다.

    • 게시자 터미널
    • sub_one 터미널
    • sub_two 터미널
  2. publisher 터미널에서 pyenv-qs라는 Python 가상 환경을 만들고 활성화합니다.

    Bash

    python -m venv pyenv-qs
    source pyenv-qs/bin/activate

    PowerShell

    py -m venv pyenv-qs
    .\pyenv-qs\Scripts\activate

    sub_onesub_two 터미널에서 다음 명령어를 실행합니다.

    Bash

    source pyenv-qs/bin/activate

    PowerShell

    .\pyenv-qs\Scripts\activate

    활성화 명령을 실행하면 명령어 프롬프트에 (pyenv-qs) $ 값이 포함됩니다.

  3. publisher 터미널에서 pip를 사용하여 Pub/Sub Python 클라이언트 라이브러리를 설치합니다.

    python -m pip install --upgrade google-cloud-pubsub
  4. 3개 터미널 모두 현재 프로젝트 ID로 환경 변수를 설정합니다. 이 gcloud 명령어는 선택한 프로젝트 ID를 확인하고 이를 변수로 설정합니다.

    Bash

    export PROJECT=`gcloud config get-value project`

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
  5. 3개 터미널 모두 샘플 코드가 포함된 프로젝트 경로로 변경합니다.

    cd python-pubsub/samples/snippets/quickstart/

앱을 시작하고 메시지 흐름 관찰

구독자 1 애플리케이션 시작

sub_one 터미널에서 구독자 1을 시작합니다.

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

애플리케이션이 시작되면 서버와의 양방향 스트리밍 연결이 열립니다. Pub/Sub은 스트림으로 메시지를 전달합니다.

구독자 1 애플리케이션은 sub_one 구독에서 메시지 수신 대기를 시작합니다.

게시자 애플리케이션 시작

게시자 터미널에서 게시자 애플리케이션을 시작합니다.

Bash

python pub.py $PROJECT hello_topic

PowerShell

py pub.py $env:PROJECT hello_topic

게시자 애플리케이션이 시작되면 Pub/Sub 시스템에서 다음을 수행합니다.

  • 게시자 애플리케이션은 기존 구독을 인지하지 않은 상태에서 'Hello, World!' 메시지를 Pub/Sub로 전송합니다. 서버는 메시지 ID도 할당합니다.

  • 구독자 1 애플리케이션은 'Hello World' 메시지를 수신 및 인쇄하고 Pub/Sub에 확인을 전송합니다.

  • 게시자 애플리케이션은 확인을 인쇄합니다. 확인은 Pub/Sub에 메시지가 성공적으로 처리되었으며 이 구독자나 다른 어떤 sub_one 구독자에게도 다시 보낼 필요가 없음을 알립니다.

Pub/Sub는 sub_one에서 메시지를 삭제합니다.

게시자 애플리케이션은 메시지를 게시하고 메시지 ID를 할당합니다. 구독자 1 애플리케이션은 'Hello World' 메시지를 수신하고 확인을 전송합니다.

구독자 2 애플리케이션 시작

sub_two 터미널에서 구독자 2를 시작합니다.

Bash

python sub.py $PROJECT sub_two

PowerShell

py sub.py $env:PROJECT sub_two

이 구독자는 sub_two 구독으로 배달된 메시지를 수신합니다. 구독자 2sub.py 스크립트를 재사용합니다. 차이점은 구독자 2는 게시자가 주제 및 구독에 메시지를 전송한 다음에 시작된다는 것입니다. 게시자구독자 2를 직접 호출하는 경우 게시 애플리케이션은 구독자 2가 나타날 때까지 기다리거나 타임아웃되어야 합니다. Pub/Sub는 구독자 2에 대한 메시지를 사실상 저장하는 방법으로 이 프로세스를 관리합니다.

구독자 2는 수신 대기를 시작하고 sub_two에서 대기하던 메시지를 수신합니다.

이제 Pub/Sub를 사용하여 개발할 준비가 되었습니다!

어땠나요?

추가 리소스 및 링크는 Pub/Sub 지원 페이지에서 확인할 수 있습니다.

삭제

  1. 실행 중인 애플리케이션을 모두 중지합니다.
  2. 로컬 환경에서 샘플 코드 디렉터리를 삭제합니다.
  3. 주제를 삭제합니다.

    gcloud pubsub topics delete hello_topic
  4. 구독을 삭제합니다.

    gcloud pubsub subscriptions delete sub_one
    gcloud pubsub subscriptions delete sub_two
  5. Google Cloud 콘솔의 IAM 및 관리 섹션에서 튜토리얼 프로젝트를 종료합니다.

  6. Optional: Revoke the authentication credentials that you created, and delete the local credential file.

    gcloud auth application-default revoke
  7. Optional: Revoke credentials from the gcloud CLI.

    gcloud auth revoke

다음 단계

다음을 시도해볼 수 있습니다.

  • 튜토리얼의 pub.pysub.py 코드를 검토하고 GitHub의 다른 Pub/Sub 샘플을 살펴봅니다. 연습으로 매초 로컬 시간을 게시하는 pub.py 버전을 만듭니다.

  • 메시지 일괄 처리 방법을 익힙니다.

  • 푸시 구독을 사용하여 App Engine 엔드포인트 또는 Cloud Functions를 트리거하는 메시지를 수신합니다.

  • 재생을 사용하여 이전에 확인된 메시지를 불러옵니다. 기본적으로 Pub/Sub는 확인된 메시지를 구독에서 삭제합니다. 예를 들어 이 튜토리얼에서는 sub.py를 다시 실행하여 'Hello, World!' 메시지를 다시 수신할 수 없습니다. 재생 기능을 사용하면 메시지가 확인된 후 메시지를 수신하도록 구독을 설정할 수 있습니다.

  • 다른 언어로 클라이언트 라이브러리를 시작합니다.