일대다 Pub/Sub 시스템 빌드

소개

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

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

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

요구사항

  • Google 계정
  • 완료하기까지 최대 한 시간의 여유 시간

시스템 개요

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

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

두 구독자 애플리케이션은 같은 코드를 사용하지만 서로 다른 시간에 각 애플리케이션을 시작합니다. 이 프로세스는 Pub/Sub가 비동기 통신을 사용하는 방법을 보여줍니다. 이 시스템을 빌드하기 위해 필요한 절차는 다음과 같습니다.

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

가이드 설정

Google Cloud 프로젝트 및 Pub/Sub 주제 및 구독 설정

  1. Google Cloud Console에 로그인합니다.

    Google Cloud Console로 이동합니다.

    클라우드를 처음 사용하는 경우 활성화를 클릭하고 메시지에 따라 클라우드 계정을 만듭니다.

  2. 기존 프로젝트를 선택하거나 새 프로젝트를 생성합니다. Google Cloud를 처음 사용할 때 기본 프로젝트가 자동으로 생성됩니다.

    Cloud Console의 섹션에서 프로젝트 ID를 기록해 둡니다. Cloud SDK 초기화 프로세스에서 현재 Cloud Storage 프로젝트를 설정할 때 이 값을 사용합니다. 또한 게시자와 구독자 애플리케이션을 시작할 때 Python 스크립트에 이 ID를 전달합니다.

  3. Google Cloud Console의 Pub/Sub 섹션으로 이동합니다.

    Pub/Sub 섹션으로 이동

    메시지에 따라 API를 사용 설정합니다.

  4. 주제 만들기를 클릭합니다. 애플리케이션을 게시하면 주제로 메시지가 전송됩니다. 이름에는 hello_topic을 사용합니다.

  5. 주제 세부정보 페이지에서 구독 만들기를 클릭합니다.

    1. 구독의 이름을 sub_one으로 설정합니다. 기본 설정은 아무것도 변경하지 마세요. 지금 만드는 것은 StreamingPull 구독이며, 이는 가져오기 구독 유형입니다.

    2. 같은 절차를 사용하여 hello_topic에 연결되는 sub_two라는 다른 구독을 만듭니다.

      주제 보기에서 주제 이름을 클릭하여 새 구독을 보거나 구독 보기로 변경할 수 있습니다.

여기까지 하면 Pub/Sub 환경은 게시 애플리케이션과 구독 애플리케이션 사이의 메시지 흐름을 관리할 준비가 된 것입니다.

서비스 계정 자격 증명 만들기

  1. 콘솔의 서비스 계정 섹션으로 이동합니다.

    IAM 서비스 계정으로 이동

  2. 프로젝트를 선택하고 서비스 계정 만들기를 클릭합니다.

  3. 서비스 계정 이름(예: pubsub-tutorial)을 입력합니다.

  4. 만들기를 클릭합니다.

  5. 가이드의 경우 서비스 계정에 게시 및 구독 권한이 필요합니다. 역할 선택 드롭다운을 사용하여 Pub/Sub 게시자 역할을 추가합니다.

    Pub/Sub 역할을 필터링할 문자열 'pub'를 사용하는 서비스 계정 권한 대화 상자

  6. 다른 역할 추가를 클릭하고 Pub/Sub 구독자를 추가합니다.

    Pub/Sub 게시자 및 Pub/Sub 구독자가 있는 서비스 계정 권한 대화 상자, 계속 버튼 클릭

  7. 계속을 클릭합니다. 사용자에게 이 서비스 계정에 대한 액세스 권한을 부여할 필요가 없습니다.

  8. 키 만들기를 클릭합니다. 키는 클라이언트 라이브러리에서 Pub/Sub API에 액세스하는 데 사용됩니다.

  9. JSON을 선택하고 만들기를 클릭합니다.

    키는 Downloads 폴더로 전송됩니다. 이 가이드 용도로는 해당 폴더에 그대로 두면 됩니다.

  10. 키 파일 이름을 ~/Downloads/key.json으로 변경합니다.

Cloud SDK 설치

  1. Cloud SDK 설치 및 초기화 안내를 따릅니다.

    • Cloud SDK를 초기화할 때 프로젝트 ID를 입력하는 옵션을 선택하고, 만든 프로젝트의 ID를 입력하거나 설정 섹션에서 선택합니다.

    • Cloud SDK를 설치하고 초기화한 후 이 가이드로 돌아갈 수 있습니다. 다른 구성 요소를 설치하거나 Cloud 클라이언트 라이브러리를 다운로드할 필요가 없습니다.

    Cloud SDK를 설치한 후에는 gcloud 명령줄 도구를 사용하여 Compute Engine에서 Pub/Sub 작업을 수행할 수 있습니다.

  2. 이러한 gcloud 명령어를 사용하기 전에 새 터미널을 시작합니다.

    gcloud pubsub topics list
    gcloud pubsub subscriptions list
    

    또한 초기화하는 동안 설정한 항목에서 프로젝트를 변경하도록 gcloud config set project PROJECT_ID를 사용할 수 있습니다.

Python 가져오기 및 가상 환경 설정

이 가이드에서는 사용 예시를 제공하므로 가상 환경 설정 섹션에 나오는 예시를 따를 필요는 없습니다. 가상 환경을 설치한 후 이 가이드로 돌아갈 수 있습니다.

게시자 및 구독자 코드 체크아웃

  1. 이 가이드에 필요한 Pub/Sub Python 파일을 저장할 프로젝트 폴더를 만듭니다. 그런 다음 이 폴더로 변경하여 코드를 다운로드합니다.

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

3개 터미널 설정

  1. 각 가이드 애플리케이션에 대해 하나의 터미널을 시작합니다(게시자 하나와 구독자 둘). 각 터미널에서 이 섹션의 모든 작업을 수행합니다. 편의를 위해 이러한 터미널을 다음과 같이 지칭하겠습니다.

    • 게시자 터미널
    • sub_one 터미널
    • sub_two 터미널
  2. Python 가상 환경을 만들고 활성화합니다.

    첫 번째 터미널에서 이 명령어를 실행하여 pyenv-qs라는 이름의 가상 환경을 만들고 활성화합니다.

    Bash

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

    PowerShell

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

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

    Bash

    source pyenv-qs/bin/activate
    

    PowerShell

    .\pyenv-qs\Scripts\activate
    

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

    가상 환경을 다른 Python 버전으로 지정할 수도 있습니다.

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

    pip install --upgrade google-cloud-pubsub

    JSON 키를 서비스 계정과 연결합니다. 서비스 계정 사용자 인증 정보를 만들 때 주요 Pub/Sub 역할을 할당했습니다. Pub/Sub 클라이언트 라이브러리는 환경 변수 GOOGLE_APPLICATION_CREDENTIALS에 액세스하고 서비스 계정과 연결된 역할 및 권한이 부여됩니다.

    Bash

    export GOOGLE_APPLICATION_CREDENTIALS=~/Downloads/key.json
    

    PowerShell

    $env:GOOGLE_APPLICATION_CREDENTIALS="$HOME\Downloads\key.json"
    
  4. 프로젝트 ID를 사용하여 환경 변수를 설정합니다. 이 gcloud 명령어는 현재 선택된 프로젝트 ID를 확인하고 이를 변수로 설정합니다.

    Bash

    export PROJECT=gcloud config get-value project
    

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
    

    현재 GCP가 올바르게 이 변수로 등록되었는지 확인하려면 다음을 사용하세요.

    Bash

    echo $PROJECT
    

    PowerShell

    $env:PROJECT
    
  5. 프로젝트 폴더로 변경한 다음 가이드 샘플 폴더로 이동합니다.

    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. 로컬 환경에서 ~/pubsub-quickstart 디렉터리를 삭제합니다.

  3. Google Cloud Console의 IAM 및 관리 섹션에서 가이드 프로젝트를 종료합니다.

  4. 서비스 계정 사용자 인증 정보를 제거합니다(rm ~/Downloads/key.json).

다음 단계

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

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

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

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

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