Google Cloud Platform 에서 PUB/SUB 사용하기
Google Cloud Platform 에서 PUB/SUB 사용하기
Google Cloud Platform(GCP)에서 실시간으로 안정적인 메시징 및 데이터 스트리밍을 제공하는 글로벌 서비스가 Pub/Sub 이다.1. GCP Pub/Sub 서비스 소개
1.1 확장 가능한 메시징 미딜웨어
Cloud Pub/Sub는 실시간 메시징 서비스로 개별 응용 프로그램간에 메시지를 주고 받을 수 있다. 그리고 GCP 또는 인터넷의 다른 곳에 있는 시스템 또는 컴포넌트들을 분리하기 위하여 Cloud Pub/Sub을 활용할 수 있다. Cloud Pub/Sub는 1초에 100만건을 낮은 대기 시간에 '적어도 한 번은' 제공되도록 설계되어 있다고 한다.1.2 모든 데이터에 연결
Cloud Pub/Sub을 사용하여 여러 소스로부터 데이터에 publish와 subscribe 한 후, Google Cloud Dataflow에 의한 데이터의 파악도 실시간으로 실행할 수 있다. Cloud Pub/Sub을 사용하면 분산 응용 프로그램 구성 요구산의 복잡한 종석성을 줄일 수 있다. Cloud Pub/Sub는 구글의 광고에서 GMail까지 구글 앱에 사용되는 동일한 메시징 기술이라고 한다.1.3 GCP의 Pub/Sub 특징
- 뛰어난 확장성
- 기본적으로 1초에 1만건의 메시지를 보낼 수 있고, 요청에 따라 100만 건 이상을 보낼 수 있음
- Push / Poll 전달
- Subscribers이 인터넷 또는 방화벽 내에 위치 여부에 상관없이 유연한 전달 옵션들을 가짐
- 암호화
- 모든 메시지 데이터는 전송될 때나 저장될 때도 암호화 되어 안전하게 보호
- 복제된 스토리지
- 모든 메시지를 여러 영역의 여러 서버에 저장하여 'at least once' 메시지 전달이 제공되도록 설계
- 메시지 큐
- 1:1 통신 패턴을 지원하기 위해 단일 Topic과 Subscription을 사용하는 확장 가능한 메시지 큐 생성
- 종단 간 응답 확인
- 응용 프로그램 수준에서 명시적인 응답을 확인함으로써 신뢰할 수 있는 응용 프로그램을 쉽게 구축 가능
- Fan-Out
- 1:N 또는 N:N 통신 패턴들을 지원하기 위해 하나의 Topic 메시지를 publish하고, 다중의 subscriber들이 복사본들을 받음
- REST API
- 많은 프로그래밍 언어에서 API 라이브러들과 함께 JSON 메시지를 사용하는 간단하고 상태가 없는 인터페이스
2. GCP Pub/Sub 서비스 사용하기
GCP의 모든 기능들이 동일하게 프로젝트 기반에서 동작한다. 따라서 Pub/Sub 서비스를 사용할 때도 우선 프로젝트를 생성이 필요하다. (참고: https://mansoo-sw.blogspot.kr/2016/10/google-cloud-platform-comput-enginevm.html)
2.1 Google Cloud Access Token 생성
GCP에서는 특정 서비스를 사용하기 위해서는 Access Token이 필요한데, 이것은 GCP Console에서 쉽게 생성할 수 있다.
Google Cloud Access Token 생성은 API 관리자에서 생성할 수 있다. 아래 그림과 같이 대시보드에서 '사용자 인증 정보로 이동' 버튼을 누른다.
'사용자 인증 정보 만들기' 버튼을 눌러 '서비스 계정 키'을 선택한다.
사용자 인증 정보에서는 '서비스 계정' 타입을 설정할 수 있는데, 여기서는 'Compute Engine default service account'을 선택하고, '키 유형'은 JSON 파일형태로 설정 후 '생성' 버튼을 누른다.
인증 정보의 종류는 'Google Cloud Pub/Sub API'을 선택하고, 아래 항목은 설정된 환경에 맞춰 선택한다.
마지막 단계에서 '완료' 버튼을 누르면 JSON 파일을 다운로드 받을 수 있다. AWS와 동일하게 생성된 JSON 파일은 한번만 다운로드 받을 수 있기 때문에 잘 관리해야 한다.
2.2 Topic 만들기
프로젝트가 생성되면 '제품 및 서비스' 버튼(

Topic 이름은 'twitter' 로 입력 후 생성했다.

메시지를 구독(Subscription)하려면 아래와 같이 Topic(주제) 선택, 그 다음에 '+새구독' 을 선택 후 subscription 이름을 입력한다. 생성된 subscription은 왼쪽 화면에서 '구독' 버튼을 누르면 subscription 항목들을 볼 수 있다.
2.3 Topic / Subscription 사용하기
간단하게 Node.js을 이용하여 topic을 publish하거나 publish된 topic에 대해 subscribe 후 받을 수 있도록 한다.
Node.js을 사용하여 GCP Pub/Sub을 이용하려면 npm 툴을 사용하여 google-cloud/pubsub 모듈을 설치하야 한다.
[Node.js 설치 / Linux]
만일 Node.js가 설치되지 않았다면 다음과 같이 설치 한다.
$ sudo apt install nodejs-legacy $ sudo apt install npm
[Node.js 설치 / macOS]
$ brew install node
Node.js와 NPM이 설치되었다면 google-cloud/pubsub 모듈을 설치할 수 있다. 단지 npm 툴의 버전은 3.0 이상이 되어야 한다.
[google-cloud/pubsub 모듈 설치]
$ mkdir ~/gcp_test $ cd ~/gcp_test $ npm install --save @google-cloud/pubsub
그리고 '2.1 Google Cloud Access Token 생성' 에서 다운로드 받은 JSON 파일을 복사하거나, 경로를 확인한다. 다음 JavaScript 소스는 'twitter' subscription에 subscribe 후에 'message' 이벤트를 받으면 화면에 표시를 하고, 단 한번 'New message' 데이터로 topic을 publish 하는 예제이다.
ACK을 보내지 않기 때문에 메시지를 지속적으로 받게 된다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is a Javascript sample code for Google Cloud Platform's Pub/Sub Service | |
// 'xxxx' in source code means that you have to change it to your information. | |
// Your Google Cloud Platform project ID | |
const projectId = 'mansoo-xxxx-analysis'; | |
// Imports the Google Cloud client library | |
const PubSub = require('@google-cloud/pubsub'); | |
// Instantiates a client | |
const pubsubClient = PubSub({ | |
projectId: projectId, | |
keyFilename: './xxxx.json' | |
}); | |
// The name for the new topic | |
const topicName = 'twitter'; | |
const subName = 'twitter'; | |
var subscription = pubsubClient.subscription(subName); | |
// Register a listener for `message` events. | |
subscription.on('message', function(message) { | |
console.log('Received message: id = ' + message.id + ', data = ' + message.data + ', attributes = ' + message.attribute); | |
// Called every time a message is received. | |
// message.id = ID used to acknowledge its receival. | |
// message.data = Contents of the message. | |
// message.attributes = Attributes of the message. | |
}); | |
var topic = pubsubClient.topic(topicName); | |
topic.publish({ | |
data: 'New message!' | |
}, function(err) {}); |
[실행]
$ node pub-sub.js
3. 참고
2. Cloud Pub/Sub Client Libraries: https://cloud.google.com/pubsub/docs/reference/libraries#client_libraries_usage_nodejs
댓글
댓글 쓰기