이 튜토리얼에서는 동기 RPC가 아닌 Pub/Sub를 통해 메시지를 전송하는 방법으로 통신하는 애플리케이션 모음을 설정하는 과정을 안내합니다. 애플리케이션을 분리함으로써 메시징은 다음과 같은 효과를 제공합니다.
- 애플리케이션의 견고성 강화
- 개발이 간소화될 수 있음
예를 들어 호출자(게시자)는 수신자(구독자)가 현재 실행되어 가용한 상태일 필요가 없습니다. 게시자가 메시지를 Pub/Sub로 전송합니다. 게시자는 어느 구독자 애플리케이션 몇 개가 메시지를 수신해야 하는지 알 필요가 없습니다. 결과적으로, 서비스에 의존해서 하나 이상의 구독자 애플리케이션에 해당 애플리케이션이 가용할 때마다 메시지를 배달할 수 있습니다.
시스템 개요
이 튜토리얼에서는 아래의 다이어그램과 같이 일대다 커뮤니케이션을 사용하여 두 구독자에게 'Hello, World!' 메시지를 전송하는 게시자 애플리케이션을 시작합니다.
두 구독자 애플리케이션은 같은 코드를 사용하지만 서로 다른 시간에 각 애플리케이션을 시작합니다. 이 프로세스는 Pub/Sub가 비동기 통신을 사용하는 방법을 보여줍니다. 이 시스템을 빌드하려면 다음 단계를 완료하세요.
- 애플리케이션에서 인증에 사용하는 IAM 서비스 계정을 만듭니다.
- IAM 권한을 설정합니다.
- Pub/Sub 주제 및 구독을 만듭니다.
- 세 개의 독립적인 애플리케이션(게시자 하나, 구독자 둘)을 시작합니다.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Enable the Pub/Sub API:
gcloud services enable pubsub.googleapis.com
-
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Google 계정에 역할을 부여합니다. 다음 각 IAM 역할에 대해 다음 명령어를 한 번씩 실행합니다.
roles/pubsub.publisher, roles/pubsub.subscriber
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
PROJECT_ID
를 프로젝트 ID로 바꿉니다.EMAIL_ADDRESS
를 이메일 주소로 바꿉니다.ROLE
을 각 개별 역할로 바꿉니다.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Enable the Pub/Sub API:
gcloud services enable pubsub.googleapis.com
-
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Google 계정에 역할을 부여합니다. 다음 각 IAM 역할에 대해 다음 명령어를 한 번씩 실행합니다.
roles/pubsub.publisher, roles/pubsub.subscriber
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
PROJECT_ID
를 프로젝트 ID로 바꿉니다.EMAIL_ADDRESS
를 이메일 주소로 바꿉니다.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
일대다 시스템 빌드
게시자 및 구독자 코드 다운로드
이 튜토리얼에 필요한 Pub/Sub Python 파일을 다운로드합니다.
git clone https://github.com/googleapis/python-pubsub.git
계속 진행하기 전에 열려 있는 터미널을 모두 닫습니다.
3개 터미널 설정
각 튜토리얼 애플리케이션에 대해 하나의 터미널을 시작합니다(게시자 하나와 구독자 둘). 편의를 위해 이 튜토리얼에서는 다음 터미널을 호출합니다.
- 게시자 터미널
- sub_one 터미널
- sub_two 터미널
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_one 및 sub_two 터미널에서 다음 명령어를 실행합니다.
Bash
source pyenv-qs/bin/activate
PowerShell
.\pyenv-qs\Scripts\activate
활성화 명령을 실행하면 명령어 프롬프트에
(pyenv-qs) $
값이 포함됩니다.publisher 터미널에서
pip
를 사용하여 Pub/Sub Python 클라이언트 라이브러리를 설치합니다.python -m pip install --upgrade google-cloud-pubsub
3개 터미널 모두 현재 프로젝트 ID로 환경 변수를 설정합니다. 이 gcloud 명령어는 선택한 프로젝트 ID를 확인하고 이를 변수로 설정합니다.
Bash
export PROJECT=`gcloud config get-value project`
PowerShell
$env:PROJECT=$(gcloud config get-value project)
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은 스트림으로 메시지를 전달합니다.
게시자 애플리케이션 시작
게시자 터미널에서 게시자 애플리케이션을 시작합니다.
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에서 메시지를 삭제합니다.
구독자 2 애플리케이션 시작
sub_two 터미널에서 구독자 2를 시작합니다.
Bash
python sub.py $PROJECT sub_two
PowerShell
py sub.py $env:PROJECT sub_two
이 구독자는 sub_two 구독으로 배달된 메시지를 수신합니다.
구독자 2는 sub.py
스크립트를 재사용합니다. 차이점은 구독자 2는 게시자가 주제 및 구독에 메시지를 전송한 다음에 시작된다는 것입니다. 게시자가 구독자 2를 직접 호출하는 경우 게시 애플리케이션은 구독자 2가 나타날 때까지 기다리거나 타임아웃되어야 합니다. Pub/Sub는 구독자 2에 대한 메시지를 사실상 저장하는 방법으로 이 프로세스를 관리합니다.
이제 Pub/Sub를 사용하여 개발할 준비가 되었습니다!
어땠나요?
추가 리소스 및 링크는 Pub/Sub 지원 페이지에서 확인할 수 있습니다.
삭제
- 실행 중인 애플리케이션을 모두 중지합니다.
- 로컬 환경에서 샘플 코드 디렉터리를 삭제합니다.
주제를 삭제합니다.
gcloud pubsub topics delete hello_topic
구독을 삭제합니다.
gcloud pubsub subscriptions delete sub_one
gcloud pubsub subscriptions delete sub_two
Google Cloud 콘솔의 IAM 및 관리 섹션에서 튜토리얼 프로젝트를 종료합니다.
-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke
다음 단계
다음을 시도해볼 수 있습니다.
튜토리얼의
pub.py
및sub.py
코드를 검토하고 GitHub의 다른 Pub/Sub 샘플을 살펴봅니다. 연습으로 매초 로컬 시간을 게시하는pub.py
버전을 만듭니다.메시지 일괄 처리 방법을 익힙니다.
푸시 구독을 사용하여 App Engine 엔드포인트 또는 Cloud Functions를 트리거하는 메시지를 수신합니다.
재생을 사용하여 이전에 확인된 메시지를 불러옵니다. 기본적으로 Pub/Sub는 확인된 메시지를 구독에서 삭제합니다. 예를 들어 이 튜토리얼에서는
sub.py
를 다시 실행하여 'Hello, World!' 메시지를 다시 수신할 수 없습니다. 재생 기능을 사용하면 메시지가 확인된 후 메시지를 수신하도록 구독을 설정할 수 있습니다.다른 언어로 클라이언트 라이브러리를 시작합니다.