네트워크를 통해 데이터 센터에 지능적으로 자동 분산됩니다.
메시지들을 큐에 넣고 차례로 전달해주는 서비스
서버가 응답을 처리하지 못할때 큐에 집어 넣어 서버가 살아 났을때 처리를 할 수도 있습니다.
하나의 Topic
1개 이상의 Subscription
이벤트 제작자 및 소비자 시스템을 만들 수 있습니다.
게시자는 동기식 리모트 프로시저 콜(RPC)이 아니라 이벤트를 브로드캐스트하여 구독자와 비동기적으로 통신합니다.
구글 Pub/Sub 은 Message Provider (보내는쪽)과 Message Consumer (받는쪽)이 1:1 관계가 아니라. 1:N 관계
Pull 방식은 구독자가 데이터를 요청할때 전달받는 구조의 구독 방식입니다.
||Pull|Push|
|--|||
|엔드 포인트|자격을 증명한 인터넷 상의 모든 기기는 API 호출 가능|자격 증명이 어려운 서비스에서 하용할 수 있음|
|부하 분산|여러 구독자가 Share와 같은 Pull 요청을 구성할 수 있음|엔드포인트가 부하분산기가 될 수 있음|
|구성|구성필요 없음|내보내기 엔드포인트를 구성해야함|
|흐름 관리|구독자가 전달 속도를 조절함|Cloud Pub/Sub 서버가 자동으로 흐롬제어 구현|
|지침|대량 메시지
메시지 처리의 효율성과 처리량이 중요할 경우|Google Cloud 종속 서비스와의 환경 동일한 webgook에 의한 여러 주제를 처리해야 하는 경우
App Engine 표준 구독자|
메시지 서비스의 성능판단 요소
다양한 유형의 문제를 얼마나 잘 처리해서 최종 사용자가 오류 해결을 알아차리지 못하게 하는가를 기준으로 측정
시스템 성능을 시간 기준으로 측정한 것으로 대부분의 서비스는 지연 시간을 최소화 하려고 합니다.
Pub/Sub 서버는 전 세계의 모든 GCP 리전에서 실행됩니다. 이로 인해 서비스가 빠른 글로벌 데이터 액세스를 제공하고 사용자는 메시지가 저장되는 위치를 제어
Pub/Sub의 부하 분산 메커니즘은 IAM 및 관리 콘솔의 리소스 위치 제한 섹션에 정의된 대로 데이터 저장이 허용되는 가장 가까운 GCP 데이터 센터로 게시자 트래픽을 전송
즉, 여러 리전의 게시자가 하나의 주제에 대한 메시지를 짧은 지연 시간으로 게시할 수 있습니다. 모든 개별 메시지는 단일 리전에 저장됩니다. 하지만 하나의 주제에는 여러 리전에 저장된 메시지가 있을 수 있습니다. 구독자 클라이언트가 이 주제에 게시된 메시지를 요청하면 해당 주제에 게시된 모든 메시지의 데이터를 집계하여 클라이언트에게 전달하기 위해 가장 가까운 서버에 연결합니다.
게시자와 구독자 간의 데이터 이동을 처리 = 메시지의 라이프사이클
서버 - 포워더 / 구독자와 연결된 부분을 구독 포워더
게시자가 메시지를 전송
메시지를 스토리지에 기록
Pub/Sub가 메시지 수신 확인을 게시자에게 전송하고 연결된 모든 구독에 대한 메시지 전송을 보장
메시지를 스토리지에 기록함과 동시에 Pub/Sub가 이를 구독자에게 전달
구독자가 메시지 처리 확인을 Pub/Sub에 전송
각 구독에 대해 하나 이상의 구독자가 메시지를 확인하면 Pub/Sub가 메시지를 스토리지에서 삭제
게시자와 구독자를 데이터 영역의 서버에 할당하는 작업을 처리
서버 - 라우터
const {PubSub} = require('@google-cloud/pubsub');
const pubSubClient = new PubSub();
async function createSubscription() {
await pubSubClient.topic(topicName).createSubscription(subscriptionName);
console.log(`Subscription ${subscriptionName} created.`);
}
createSubscription().catch(console.error);
const {PubSub} = require('@google-cloud/pubsub');
const pubSubClient = new PubSub();
async function createPushSubscription() {
const options = {
pushConfig: {
pushEndpoint: `https://${pubSubClient.projectId}.appspot.com/push`,
},
};
await pubSubClient
.topic(topicName)
.createSubscription(subscriptionName, options);
console.log(`Subscription ${subscriptionName} created.`);
}
createPushSubscription().catch(console.error);