Pub/Sub 시스템 빌드 시 페이로드 래핑을 해제하면 표준 Pub/Sub push 엔드포인트 구현의 모든 시스템 요구사항을 준수하지 않는 다른 시스템에 연결할 수 있습니다.
페이로드 래핑 해제의 몇 가지 사용 사례는 다음과 같습니다.
- HTTP push 엔드포인트에 Pub/Sub 관련 메시지 파싱 코드를 작성하고 싶지 않습니다.
- HTTP POST 본문의 메타데이터 대신 Pub/Sub 메시지 메타데이터를 HTTP 헤더로 수신하고 싶습니다.
- Pub/Sub 메시지를 전송하고 Pub/Sub 메타데이터를 제외하려고 합니다(예: 서드 파티 API로 데이터를 전송할 때).
페이로드 래핑 해제 작동 방식
페이로드 래핑 해제는 Pub/Sub 메시지에서 메시지 데이터를 제외한 모든 메시지 메타데이터를 제거하는 기능입니다. 구독자는 원시 메시지 데이터를 전송하여 Pub/Sub의 시스템 요구사항을 준수하지 않고도 메시지를 처리할 수 있습니다.
- 페이로드의 래핑을 해제하면 메시지 데이터가 HTTP 본문으로 직접 전달됩니다.
- 페이로드 래핑 해제 없이 Pub/Sub는 여러 메시지 메타데이터 필드와 메시지 데이터 필드가 포함된 JSON 객체를 전송합니다. 이 경우 JSON을 파싱하여 메시지 데이터를 가져온 다음 base64로 디코딩해야 합니다.
메타데이터 쓰기
페이로드 래핑 해제를 사용 설정한 후에는 이전에 삭제한 메시지 메타데이터를 요청 헤더에 추가하는 메타데이터 쓰기 옵션을 사용할 수 있습니다.
- 쓰기 메타데이터가 사용 설정되었습니다. 메시지 메타데이터를 요청 헤더에 다시 추가합니다. 디코딩된 원시 메시지 데이터도 전달합니다.
- 쓰기 메타데이터가 사용 중지되었습니다. 디코딩된 원시 메시지 데이터만 전달합니다.
쓰기 메타데이터는 Pub/Sub, Google Cloud CLI 인수 --push-no-wrapper-write-metadata
, API 속성 NoWrapper
를 통해 노출됩니다.
기본적으로 이 값은 null입니다.
시작하기 전에
래핑된 메시지와 래핑되지 않은 메시지 예시
다음 예시는 래핑된 HTTP 메시지와 래핑되지 않은 HTTP 메시지 전송의 차이를 보여줍니다. 이 예시에서 메시지 데이터에는 {"status": "Hello there"}
문자열이 포함되어 있습니다.
이 예시에서는 페이로드 래핑 해제 기능이 사용 설정된 구독이 생성되고 mytopic
에 메시지를 게시합니다. 값이 some-key
인 순서 키를 사용하고 미디어 유형이 application/json
으로 선언됩니다.
gcloud pubsub topics publish mytopic --message='{"status": "Hello there"}' --ordering-key="some-key" --attribute "Content-Type=application/json"
다음 섹션에서는 래핑된 메시지와 래핑되지 않은 메시지의 차이를 보여줍니다.
래핑된 메시지
다음 예시에서는 래핑된 Pub/Sub 메시지 표준을 보여줍니다. 이 경우 페이로드 래핑 해제가 사용 설정되지 않습니다.
게시 | push 엔드포인트 수신 |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
Content-Length: 361 Content-Type: application/json User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com { "message": { "attributes": { "Content-Type": "application/json" }, "data": "eyJzdGF0dXMiOiAiSGVsbG8gdGhlcmUifQ==", // Base64 - {"status": "Hello there"} "messageId": "2070443601311540", "message_id": "2070443601311540", "publishTime": "2021-02-26T19:13:55.749Z", "publish_time": "2021-02-26T19:13:55.749Z" }, "subscription": "projects/myproject/..." } |
쓰기 메타데이터가 사용 중지된 래핑되지 않은 메시지
다음 예시는 쓰기 메타데이터 옵션이 사용 중지된 래핑되지 않은 메시지를 보여줍니다. 이 경우 x-goog-pubsub-*
헤더와 메시지 속성은 포함되지 않습니다.
게시 | push 엔드포인트 수신 |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
Content-Length: 25 User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com {"status": "Hello there"} |
쓰기 메타데이터가 사용 설정된 래핑되지 않은 메시지
다음 예시는 쓰기 메타데이터 옵션이 사용 설정된 래핑되지 않은 메시지를 보여줍니다. 이 경우 x-goog-pubsub-*
헤더와 메시지 속성이 포함됩니다.
게시 | push 엔드포인트 수신 |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
x-goog-pubsub-subscription-name: "projects/myproject/..." x-goog-pubsub-message-id: "2070443601311540" x-goog-pubsub-publish-time: "2021-02-26T19:13:55.749Z" x-goog-pubsub-ordering-key: "some-key" Content-Type: application/json Content-Length: 12 User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com {"status": "Hello there"} |
페이로드 래핑 해제 구성
Google Cloud 콘솔 구독 세부정보 페이지, Google Cloud CLI, 클라이언트 라이브러리를 사용하여 구독에 페이로드 래핑 해제 내보내기 전송을 사용 설정할 수 있습니다.
콘솔
Google Cloud 콘솔에서 구독 페이지로 이동합니다.
구독 만들기를 클릭합니다.
구독 ID 필드에 이름을 입력합니다.
구독 이름 지정 방법은 주제 또는 구독 이름 지정 안내를 참조하세요.
드롭다운 메뉴에서 주제를 선택합니다. 구독은 주제에서 메시지를 수신합니다.
전송 유형에서 푸시를 선택합니다.
페이로드 래핑 해제를 사용 설정하려면 페이로드 래핑 해제 사용 설정을 선택합니다.
(선택사항) 요청 헤더에 메시지의 메타데이터를 보존하려면 메타데이터 쓰기를 선택합니다. 메시지에 Content-Type 헤더를 설정하려면 이 옵션을 사용 설정해야 합니다.
엔드포인트 URL을 지정합니다.
다른 모든 기본값을 유지합니다.
만들기를 클릭합니다.
gcloud
표준 HTTP 헤더가 포함된 페이로드 래핑 해제와 함께 구독을 구성하려면 다음 gcloud pubsub subscriptions create
명령어를 실행합니다.
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
다음을 바꿉니다.
SUBSCRIPTION
: 풀 구독의 이름 또는 ID입니다.TOPIC
: 주제의 ID입니다.PUSH_ENDPOINT
: 이 구독의 엔드포인트로 사용할 URL입니다. 예를 들면https://myproject.appspot.com/myhandler
입니다.--push-no-wrapper
: 메시지 데이터를 HTTP 본문으로 직접 전달합니다.
페이로드 래핑 해제와 함께 구독을 구성하고 x-goog-pubsub-*
헤더의 사용을 제어하려면 다음 명령어를 실행합니다.
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper \ --push-no-wrapper-write-metadata
--push-no-wrapper-write-metadata
: true이면 Pub/Sub 메시지 메타데이터를 HTTP 요청의x-goog-pubsub-<KEY>:<VAL>
헤더에 씁니다. Pub/Sub 메시지 속성을 HTTP 요청의<KEY>:<VAL>
헤더에 씁니다.
Python
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Python API 참고 문서를 참조하세요.
Java
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Java API 참고 문서를 참조하세요.
C++
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 C++ 설정 안내를 따르세요. 자세한 내용은 Pub/Sub C++ API 참고 문서를 확인하세요.
Go
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Go API 참고 문서를 참조하세요.
Node.js
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Node.js 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Node.js API 참고 문서를 참조하세요.
Node.js
이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 Node.js 설정 안내를 따르세요. 자세한 내용은 Pub/Sub Node.js API 참고 문서를 참조하세요.
메시지에 콘텐츠 유형 헤더 설정하기
페이로드 래핑 해제를 사용 설정한 후에는 Pub/Sub가 요청에 미디어 유형 헤더 필드를 자동으로 설정하지 않습니다. Content-Type
헤더 필드를 명시적으로 설정하지 않으면 요청을 처리하는 웹 서버가 application/octet-stream
의 기본값을 설정하거나 요청을 예기치 않은 방식으로 해석할 수도 있습니다.
Content-Type
헤더가 필요한 경우 게시 시점에 모든 게시된 메시지에 대해 명시적으로 선언해야 합니다. 이렇게 하려면 먼저 메타데이터 쓰기를 사용 설정해야 합니다. 메타데이터 쓰기를 사용 설정한 결과는 제공된 예시에 나와 있습니다.
다음 단계
- 페이로드 래핑 해제에 문제가 있는 경우 페이로드 래핑 해제 문제 해결을 참조하세요.