데드 레터 주제

구독자는 다양한 이유로 메시지를 처리하지 못할 수 있습니다. 예를 들어 메시지 처리를 위해 필요한 데이터를 검색하는 데 일시적인 문제가 발생할 수 있습니다. 또는 메시지가 구독자가 예상하지 못한 형식일 수도 있습니다.

구독자가 확인할 수 없는 전송할 수 없는 메시지를 관리하기 위해 Pub/Sub는 이러한 메시지를 데드 레터 주제 (데드 레터 큐라고도 함)로 전달할 수 있습니다.

시작하기 전에

  • 데드 레터 주제 구성의 주제를 만듭니다.

    또는 이 페이지의 모든 안내를 처음부터 끝까지 따르면 후속 단계에서 주제를 만들 수 있습니다.

필요한 역할

주제와 구독을 관리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 Pub/Sub 편집자 (roles/pubsub.editor) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

프로젝트 수준 및 개별 리소스 수준에서 액세스 제어를 구성할 수 있습니다. 한 프로젝트에서 구독을 만들고 이를 다른 프로젝트에 있는 주제에 연결할 수 있습니다. 각 프로젝트에 필요한 권한이 있는지 확인합니다.

데드 레터 주제 작동 방식

구독자 애플리케이션이 메시지를 확인할 수 없는 경우 Pub/Sub는 확인 기한이 충족되거나 메시지가 만료될 때까지 전송을 재시도합니다. 구성된 전송 시도 횟수가 지나면 Pub/Sub는 전송할 수 없는 메시지를 데드 레터 주제로 전달할 수 있습니다.

Pub/Sub는 전달할 수 없는 메시지를 전달할 때 원본 메시지를 새 메시지로 래핑하고 소스 구독을 식별하는 속성을 추가합니다. 그러면 메시지가 지정된 데드 레터 주제로 전송됩니다. 그런 다음 데드 레터 주제에 연결된 별도의 구독에서 분석 및 오프라인 디버깅을 위해 전달된 메시지를 수신할 수 있습니다.

최대 전송 시도 횟수 계산 방식

Pub/Sub는 데드 레터 주제가 올바르게 구성되고 올바른 IAM 권한이 포함된 경우에만 전송 시도를 집계합니다.

최대 전송 시도 횟수는 Pub/Sub가 전송할 수 없는 메시지를 최상의 방식으로 전달하므로 대략적인 수치입니다. 서비스는 구성된 시도 횟수보다 적은 횟수로 메시지를 전달할 수도 있고, 전달하기 전에 몇 번 더 전송을 시도할 수도 있습니다.

특히 비활성 구독자가 있는 풀 구독의 경우 메시지의 추적된 전송 시도 횟수가 0으로 재설정될 수 있습니다. 따라서 메시지는 구성된 최대 전송 시도 횟수보다 구독자 클라이언트에 더 많이 전송될 수 있습니다.

데드 레터 주제 속성

데드 레터 주제에 다음 구독 속성을 설정할 수 있습니다.

  • 최대 전송 시도 횟수: Pub/Sub가 특정 메시지에 대해 수행하는 전송 시도 횟수를 나타내는 숫자 값입니다. 구독자 클라이언트가 구성된 전송 시도 횟수 이내에 메시지를 확인할 수 없으면 메시지가 데드 레터 주제로 전달됩니다.

    • 기본값 = 5
    • 최댓값 = 100
    • 최솟값 = 5
  • 데드 레터 주제가 있는 프로젝트: 데드 레터 주제가 구독과 다른 프로젝트에 있는 경우, 데드 레터 주제가 있는 프로젝트를 지정해야 합니다. 구독이 연결된 주제와 다른 주제로 데드 레터 주제를 설정합니다.

데드 레터 주제 구성

다음 단계에서는 데드 레터 주제를 사용하는 워크플로를 설명합니다.

  1. 데드 레터 주제로 사용할 주제를 만듭니다.

  2. 데드 레터 주제에 대한 구독을 만듭니다.

  3. 구독에서 데드 레터 처리를 사용 설정합니다.

  4. 이전에 만든 주제를 구독에 연결합니다.

  5. Pub/Sub 서비스 계정에 데드 레터 주제를 사용하는 데 필요한 역할을 부여합니다.

데드 레터 주제와 함께 사용할 주제 만들기

구독에 사용할 주제를 이미 만든 경우 이 단계를 건너뛰어도 됩니다.

  1. Google Cloud 콘솔에서 주제 페이지로 이동합니다.

    주제로 이동

  2. 주제 만들기를 클릭합니다.

  3. 주제 ID(예: my-test-topic)를 입력합니다.

  4. 기본 구독 옵션을 유지하고 만들기를 클릭합니다.

구독에 데드 레터 주제 설정

새 구독 또는 기존 구독에 데드 레터 주제를 설정할 수 있습니다.

새 구독에 데드 레터 주제 설정

Google Cloud 콘솔, Google Cloud CLI, 클라이언트 라이브러리 또는 Pub/Sub API를 사용하여 구독을 만들고 데드 레터 주제를 설정할 수 있습니다.

콘솔

구독을 만들고 데드 레터 주제를 설정하려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 구독 페이지로 이동합니다.

    구독 페이지로 이동

  2. 구독 만들기를 클릭합니다.

  3. 구독 ID를 입력합니다.

  4. 정기 결제에 사용할 주제를 선택합니다. 구독은 주제에서 메시지를 수신합니다. 데드 레터 주제가 아닙니다. 다음 단계에서 선택합니다.

  5. 데드 레터 처리 섹션에서 데드 레터 처리 사용을 선택합니다.

  6. 드롭다운 메뉴에서 데드 레터 주제를 선택합니다.

    선택한 데드 레터 주제에 구독이 없는 경우 시스템에서 주제를 만들라는 메시지를 표시합니다.

  7. 최대 전송 시도 횟수 필드에 5에서 100 사이의 정수를 지정합니다.

  8. 만들기를 클릭합니다.

  9. 세부정보 패널을 클릭하여 가능한 작업 항목을 확인합니다. 항목 중 하나라도 오류 아이콘()이 표시되면 작업 항목을 클릭하여 문제를 해결합니다.

    일부 작업 항목이 포함된 데드 레터 처리 탭

gcloud

구독을 만들고 데드 레터 주제를 설정하려면 gcloud pubsub subscriptions create 명령어를 사용합니다.

gcloud pubsub subscriptions create subscription-id \
  --topic=topic-id \
  --dead-letter-topic=dead-letter-topic-name \
  [--max-delivery-attempts=max-delivery-attempts] \
  [--dead-letter-topic-project=dead-letter-topic-project]

C++

이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 C++ 설정 안내를 따르세요. 자세한 내용은 Pub/Sub C++ API 참고 문서를 확인하세요.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::SubscriptionAdminClient client,
   std::string const& project_id, std::string const& topic_id,
   std::string const& subscription_id,
   std::string const& dead_letter_topic_id,
   int dead_letter_delivery_attempts) {
  google::pubsub::v1::Subscription request;
  request.set_name(
      pubsub::Subscription(project_id, subscription_id).FullName());
  request.set_topic(pubsub::Topic(project_id, topic_id).FullName());
  request.mutable_dead_letter_policy()->set_dead_letter_topic(
      pubsub::Topic(project_id, dead_letter_topic_id).FullName());
  request.mutable_dead_letter_policy()->set_max_delivery_attempts(
      dead_letter_delivery_attempts);
  auto sub = client.CreateSubscription(request);
  if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The subscription already exists\n";
    return;
  }
  if (!sub) throw std::move(sub).status();

  std::cout << "The subscription was successfully created: "
            << sub->DebugString() << "\n";

  std::cout << "It will forward dead letter messages to: "
            << sub->dead_letter_policy().dead_letter_topic() << "\n";

  std::cout << "After " << sub->dead_letter_policy().max_delivery_attempts()
            << " delivery attempts.\n";
}

C#

이 샘플을 시도하기 전에 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 Pub/Sub C# API 참고 문서를 확인하세요.


using Google.Cloud.PubSub.V1;
using System;

public class CreateSubscriptionWithDeadLetterPolicySample
{
    public Subscription CreateSubscriptionWithDeadLetterPolicy(string projectId, string topicId, string subscriptionId, string deadLetterTopicId)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        // This is the subscription you want to create with a dead letter policy.