일대다 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를 처음 사용할 때 기본 프로젝트가 자동으로 생성됩니다.

    Google Cloud console의 섹션에서 프로젝트 ID를 기록해 둡니다. gcloud CLI 초기화 프로세스에서 현재 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. 서비스 계정을 만듭니다.

    1. Google Cloud Console에서 서비스 계정 페이지로 이동합니다.

      서비스 계정으로 이동

    2. 프로젝트를 선택합니다.

    3. 서비스 계정 만들기를 클릭합니다.

    4. 서비스 계정 이름 필드에 이름(예: pubsub-tutorial)을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

    5. 선택사항: 서비스 계정 설명 필드에 서비스 계정의 설명을 입력합니다.

    6. 만들고 계속하기를 클릭합니다.

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

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

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

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

    9. 완료를 클릭하여 서비스 계정 만들기를 마칩니다.

      브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.

  2. 방금 만든 서비스 계정의 JSON 키를 다운로드합니다. 클라이언트 라이브러리에서 키를 사용하여 Pub/Sub API에 액세스합니다.

    1. Google Cloud 콘솔에서 자신이 만든 서비스 계정의 이메일 주소를 클릭합니다.
    2. 를 클릭합니다.
    3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
    4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.

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

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

    6. 닫기를 클릭합니다.

서비스 계정과 관련이 없는 사용자 인증 정보를 제공하는 다른 방법은 애플리케이션 기본 사용자 인증 정보에 대한 사용자 인증 정보 제공을 참조하세요.

Google 계정에 역할을 부여하려면 적용하려는 IAM 역할마다 다음 명령어를 한 번씩 실행합니다.

gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
  • PROJECT_ID를 프로젝트 ID로 바꿉니다.
  • EMAIL_ADDRESS를 이메일 주소로 바꿉니다.
  • ROLE을 각 개별 역할로 바꿉니다.

Google Cloud CLI 설치

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

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

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

    gcloud CLI를 설치한 후에는 Google Cloud CLI를 사용하여 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 클라이언트 라이브러리를 설치합니다.

    python -m pip install --user --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)
    

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

    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!' 메시지를 다시 수신할 수 없습니다. 재생 기능을 사용하면 메시지가 확인된 후 메시지를 수신하도록 구독을 설정할 수 있습니다.

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