Lite トピックを作成して管理する

このドキュメントでは、Pub/Sub Lite トピックの作成、表示、削除を行う方法について説明します。

Lite トピックの概要

Pub/Sub Lite サービスには、サブスクライバーがメッセージを受信できるよう、パブリッシャーがメッセージを送信できるトピックが必要です。Pub/Sub Lite 内で、ゾーンまたはリージョンの Lite トピックを作成できます。

ゾーン Lite トピックとリージョン Lite トピックでは、データの複製方法のみが異なります。その他のトピック プロパティはすべて、このドキュメントの後半のセクションで説明するものと同じです。

Lite トピックでのデータ レプリケーション

Pub/Sub Lite リージョン トピックでは、単一リージョンの 2 つのゾーンにデータが保存されます。Pub/Sub Lite ゾーン トピックでは、データは 1 つのゾーン内でのみ複製されます。Pub/Sub Lite ではデータは非同期で複製されます。

Pub/Sub Lite を使用できるかどうかは、アプリケーションのフロントエンドとストレージの両方を含む、基盤となるコンポーネントを使用できるかどうかに左右されます。

Pub/Sub Lite ゾーンのトピックを使用できるかどうかは、構成されたゾーンでのアプリケーション フロントエンドとストレージを使用できるかどうかに左右されます。アプリケーションのフロントエンドまたはストレージでゾーンの障害が発生すると、停止中はゾーン Lite トピックを使用できなくなります。

Pub/Sub Lite リージョンのトピックを使用できるかどうかは、構成されたリージョンでのアプリケーション フロントエンドとストレージを使用できるかどうかに左右されます。次のような種類の障害が発生する可能性があります。

  • アプリケーションのフロントエンド、またはストレージでゾーン障害が発生しても、リージョンの Lite トピックは引き続き使用できます。

  • アプリケーションのフロントエンドとストレージの両方でゾーンの障害が発生しても、両方のコンポーネントで同時に障害が発生しない限り、リージョン Lite トピックは引き続き使用できます。

  • アプリケーションのフロントエンドとストレージの両方で同時に障害が発生した場合、停止中はリージョン Lite トピックを使用できません。この間、クライアントはメッセージのパブリッシュや使用に失敗する場合がありますが、メッセージは正しい順序で配信されます。

リージョン Lite トピックは、ほとんどの種類の単一ゾーンの障害から保護します。ただし、レプリケーションの非同期の性質上、単一のゾーン内で複数のコンポーネントが同時に障害となることがあります。その結果、リージョン Lite トピックは使用できなくなります。

Lite トピックのプロパティ

Lite トピックのプロパティは次のとおりです。

  • パーティションの数。パーティションは、Pub/Sub Lite の並列処理の基本単位です。Lite トピックには 1 つ以上のパーティションを含めることができます。

  • パーティションの容量。パーティションの容量は、次の 3 つのプロパティで表されます。

    • パブリッシュのスループット(MiBps)。 メッセージをパブリッシュできる最大レート。

    • サブスクライブのスループット(MiBps)。Lite サブスクリプションにメッセージが転送される最大レート。

    • ストレージ(GiB)。パーティション内のメッセージの最大サイズ。パーティションの構成可能な最小容量は 30 GiB です。

  • Lite トピックのストレージ容量を増やす。Lite トピック内のすべてのパーティションには、同じストレージ容量が構成されています。Lite トピックのストレージ容量は、トピック内のすべてのパーティションのストレージ容量の合計です。たとえば、Lite トピックに 8 つのパーティションがあり、各パーティションのサイズが 30 GiB の場合、Lite トピックのストレージ容量の合計は 240 GiB(8 x 30)になります。

  • Lite トピックのスループット容量。スループット容量は、Lite トピック内にあるすべてのパーティションのパブリッシュ スループットとサブスクライブ スループットの合計容量で構成されています。全体として 1 GiB のパブリッシュ スループットをサポートできるトピックがあっても、効果的にスループットを制限するのはパーティションごとのパブリッシュ上限です。

  • サブスクライバー クライアントとサブスクリプションの制限。Pub/Sub Lite では、単一のパーティションと単一のサブスクリプションに対して 1 つのサブスクライバー クライアントがサポートされています。たとえば、5 つのパーティションがある 1 つのトピックに対する 1 つのサブスクリプションには、そのサブスクリプションのメッセージを使用するサブスクライバー クライアントを最大 5 つ含めることができます。これより多くのサブスクライバー クライアントを構成しても、超過しているクライアントはアイドル状態のままになります。同じトピックに 2 個のサブスクリプションがある場合は、各サブスクリプションにクライアントを 5 個ずつ、最大 10 個のサブスクライバー クライアントを含めることができます。

  • 予約 予約は、多くのトピックのスループット容量をプロビジョニングして管理する最も簡単な方法です。予約によるスループット容量のプロビジョニングは、リージョン Lite では必須ですが、ゾーン Lite トピックでは省略可です。

    ゾーン Lite トピックに予約を使用しない場合は、トピックのパブリッシュとサブスクライブのスループット容量を明示的にプロビジョニングする必要があります。予約がない場合、Lite トピック内のすべてのパーティションに同じスループット容量が設定されます。詳細については、予約なしでスループット容量を構成するをご覧ください。

  • ストレージ構成。ストレージを構成するには、ストレージ容量と、必要に応じてメッセージの保持期間の両方を指定する必要があります。

    • メッセージ保持期間。Lite トピックでメッセージが保存される最長時間。メッセージ保持期間を指定しなかった場合、Lite トピックはストレージ容量を超過するまでメッセージを保存します。

    • ストレージ容量。Pub/Sub Lite トピックの容量は、トピック内のパーティションの数と各パーティションのストレージ容量によって決まります。パーティションあたりのストレージ: 各パーティションのストレージ容量(バイト)。リージョン Lite トピックでは、パブリッシュされたバイトごとに 2 バイトのストレージ容量を使用します。ゾーン Lite トピックは、パブリッシュされたバイトごとに 1 バイトのストレージ容量を使用します。

    ストレージ容量を超えると、Pub/Sub Lite サービスによってメッセージのパブリッシュが続行されます。ただし、ストレージ容量を増やすために、パーティションから最も古いメッセージが削除されます。最も古いメッセージは、そのメッセージがメッセージ保持期間内にある場合でも削除されます。TTL が期限切れになる前に、サービスによってメッセージが削除されることはありません。ただし、新しくパブリッシュされたメッセージ用にスペースを確保する必要がある場合は、メッセージを削除する必要があります。容量と料金の関係については、Pub/Sub Lite の料金をご覧ください。

トピックへの名前付けに関するガイドライン

Pub/Sub Lite リソース名は、トピック、サブスクリプション、予約などの Pub/Sub Lite リソースを一意に識別します。リソース名は次の形式になっている必要があります。

projects/project-identifier/collection/ID

  • project-identifier: Google Cloud コンソールから取得可能なプロジェクト ID またはプロジェクト番号を指定する必要があります。たとえば、my-cool-project はプロジェクト ID です。123456789123 はプロジェクト番号です。

  • collection: topicssubscriptionsreservations のいずれかにする必要があります。

  • ID: 次のガイドラインに従う必要があります。

    • 文字列 goog で始めないこと。
    • 文字から始まる
    • 3~255 文字の長さであること。
    • 次の文字だけが含まれている: 文字 [A-Za-z]、数字 [0-9]、ダッシュ -、アンダースコア _、ピリオド .、チルダ ~、プラス記号 +、パーセント記号 %

    URL エンコードのないリソース名で、上記のリストの特殊文字を使用できます。ただし、URL で使用されている場合、その他すべての特殊文字が適切にエンコードまたはデコードされることを確認する必要があります。たとえば、mi-tópico は無効な ID です。mi-t%C3%B3pico は有効です。この形式は、REST 呼び出しを行うときに重要です。

Lite トピックのスループット容量を向上させる

Lite 予約を使用しない場合は、ゾーン Lite トピックの各パーティションのスループット容量を、次の上限によって設定された値に設定できます。

  • パブリッシュのスループットは 4~16 MiBps

  • サブスクライブのスループットは 4~32 MiBps

これらの上限は、Lite 予約に関連付けられたパーティションにも適用されます。 予約を設定することにより、予約の合計容量を超えない限り、指定された制限内のスループット容量を各パーティションで使用できます。必要に応じて、パーティションあたりの実際のスループットに下限を設定すると、トラフィックが予測しやすくなります。

トピック内のパーティションの数を増やして、水平方向にスケーリングできます。トピック内のパーティションの数を減らすことはできません。

パーティションの数を変更した場合は、メッセージの相対的な順序は保持されません。内部的には、メッセージはハッシュ関数を使用してパーティションに割り当てられています。 トピック内のパーティションの数を更新すると、このハッシュ関数は変更されます。同じキーであっても、パーティション カウントの更新後にパブリッシュされたメッセージは、更新の前にパブリッシュされたものとは異なるパーティションにマッピングされる可能性が高くなります。

また、トピックのサイズ変更には、すべてのパブリッシャーに反映されるまで数秒かかります。しばらくすると、一部のパブリッシャーは新しいハッシュ関数を使用し、一部のパブリッシャーは古いハッシュ関数を使用します。

Lite トピックのストレージ容量を増やす

Lite トピックのストレージ容量を増減することもできます。Lite トピックでは、各パーティションに同じ容量のストレージをプロビジョニングします。ストレージを 60 GiB に増やすと、各パーティションのストレージ容量が 60 GiB になります。

Lite トピックでストレージ容量を減らすと、Pub/Sub Lite サービスは最初に最も古いメッセージを削除します。

容量と料金の関係については、Pub/Sub Lite の料金をご覧ください。

Lite トピックの作成

Lite トピックは、Google Cloud コンソール、Google Cloud CLI、または Pub/Sub Lite API を使用して作成できます。

使用可能なリージョンとゾーンの一覧については、Pub/Sub Lite のロケーションをご覧ください。

Console

  1. [Lite トピック] ページに移動します。

    [Lite トピック] に移動

  2. [Lite トピックを作成] をクリックします。

    1. ゾーン Lite トピックを作成するには、リージョンとリージョン内のゾーンを選択します。

    2. リージョン Lite トピックを作成するには、リージョンを選択します。

    トピックの作成後にロケーションを更新することはできません。

  3. [名前] セクションでLite トピック ID を入力します。

    Lite トピック名には、Lite のトピック ID、ロケーション、プロジェクト番号が含まれます。

  4. [スループット] セクションで、次の操作を行います。

    1. 予約を選択または作成します。

      これは、ゾーン Lite トピックでは省略可、リージョン Lite トピックでは必須です。

    2. パブリッシュのピーク スループットとサブスクライブのピーク スループットを入力します。

      入力に基づいて、自動的にパーティションの数が設定されます。この番号は、トピックを保存した後に編集できます。

  5. [メッセージ ストレージ] セクションで、次の操作を行います。

    1. パーティションあたりのストレージを入力します。

    2. メッセージ保持期間の 2 つのオプションのいずれかを選択します。

  6. 変更内容を確認し、[作成] をクリックします。

gcloud

Lite トピックを作成するには、gcloud pubsub lite-topics create コマンドを使用します。

gcloud pubsub lite-topics create TOPIC_ID \
  --location=LOCATION \
  --partitions=NUMBER_OF_PARTITIONS \
  --per-partition-bytes=STORAGE_PER_PARTITION \
  [--throughput-reservation=RESERVATION_NAME \]
  [--message-retention-period=MESSAGE_RETENTION_PERIOD]

以下を置き換えます。

  • TOPIC_ID: Lite トピックの ID

  • LOCATION: Pub/Sub Lite がサポートするロケーションの名前

  • NUMBER_OF_PARTITIONS: Lite トピックのパーティション数の整数

  • STORAGE_PER_PARTITION: 各パーティションのストレージ容量(30GiB など)

  • RESERVATION_NAME: Lite の予約の完全修飾パス(例: projects/123456789/locations/us-west1/reservations/my-reservation

  • MESSAGE_RETENTION_PERIOD: Lite トピックがメッセージを保存する期間(1d2w など)

リクエストが成功すると、コマンドラインに確認メッセージが表示されます。

Created [TOPIC_ID].

プロトコル

Lite トピックを作成するには、次のような POST リクエストを送信します。

POST https://REGION-pubsublite.googleapis.com/v1/admin/projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
Authorization: Bearer $(gcloud auth print-access-token)

次のように置き換えます。

リクエスト本文に次のフィールドを指定します。

{
  "partitionConfig": {
       "count": NUMBER_OF_PARTITIONS,
       "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
       }
  },
  "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
  },
  "reservationConfig": {
       "throughputReservation": RESERVATION_NAME
  }
}

以下を置き換えます。

  • NUMBER_OF_PARTITIONS: Lite トピックのパーティション数の整数

  • STORAGE_PER_PARTITION: 各パーティションのストレージ容量(30GiB など)

  • publish_CAPACITY: 各パーティションのパブリッシュ スループット容量を表す整数

  • subscribe_CAPACITY: 各パーティションのサブスクライブ スループット容量を表す整数

  • MESSAGE_RETENTION_PERIOD: Lite トピックがメッセージを保存する期間(1d2w など)

  • RESERVATION_NAME: Lite の予約の完全修飾パス(例: projects/123456789/locations/us-west1/reservations/my-reservation

リクエストが成功すると、レスポンスは JSON 形式の Lite トピックになります。

{
  "name": projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID,
  "partitionConfig": {
       "count": NUMBER_OF_PARTITIONS,
       "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
       }
  },
  "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
  },
  "reservationConfig": {
       "throughputReservation": RESERVATION_NAME
  }
}

Go

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Go の設定手順を実施してください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func createTopic(w io.Writer, projectID, region, location, topicID, reservation string) error {
	// projectID := "my-project-id"
	// region := "us-central1" // see https://cloud.google.com/pubsub/lite/docs/locations
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	// reservation := "projects/my-project-id/reservations/my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	const gib = 1 << 30

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	// For ranges of fields in TopicConfig, see https://pkg.go.dev/cloud.google.com/go/pubsublite/#TopicConfig
	topic, err := client.CreateTopic(ctx, pubsublite.TopicConfig{
		Name:                       topicPath,
		PartitionCount:             2, // Must be >= 1 and cannot decrease after creation.
		PublishCapacityMiBPerSec:   4,
		SubscribeCapacityMiBPerSec: 8,
		PerPartitionBytes:          30 * gib,
		RetentionDuration:          pubsublite.InfiniteRetention,
		ThroughputReservation:      reservation,
	})
	if err != nil {
		return fmt.Errorf("client.CreateTopic got err: %w", err)
	}
	fmt.Fprintf(w, "Created topic: %#v\n", topic)
	return nil
}

Java

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Java の設定手順を実施してください。

import com.google.api.gax.rpc.AlreadyExistsException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig.Capacity;
import com.google.cloud.pubsublite.proto.Topic.ReservationConfig;
import com.google.cloud.pubsublite.proto.Topic.RetentionConfig;
import com.google.protobuf.util.Durations;
import java.util.concurrent.ExecutionException;

public class CreateTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'a';
    String topicId = "your-topic-id";
    String reservationId = "your-reservation-id";
    long projectNumber = Long.parseLong("123456789");
    int partitions = 1;
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = false;

    createTopicExample(
        cloudRegion, zoneId, projectNumber, topicId, reservationId, partitions, regional);
  }

  public static void createTopicExample(
      String cloudRegion,
      char zoneId,
      long projectNumber,
      String topicId,
      String reservationId,
      int partitions,
      boolean regional)
      throws Exception {

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    Topic topic =
        Topic.newBuilder()
            .setPartitionConfig(
                PartitionConfig.newBuilder()
                    // Set throughput capacity per partition in MiB/s.
                    .setCapacity(
                        Capacity.newBuilder()
                            // Must be 4-16 MiB/s.
                            .setPublishMibPerSec(4)
                            // Must be 4-32 MiB/s.
                            .setSubscribeMibPerSec(8)
                            .build())
                    .setCount(partitions))
            .setRetentionConfig(
                RetentionConfig.newBuilder()
                    // How long messages are retained.
                    .setPeriod(Durations.fromDays(1))
                    // Set storage per partition to 30 GiB. This must be 30 GiB-10 TiB.
                    // If the number of bytes stored in any of the topic's partitions grows
                    // beyond this value, older messages will be dropped to make room for
                    // newer ones, regardless of the value of `period`.
                    .setPerPartitionBytes(30 * 1024 * 1024 * 1024L))
            .setReservationConfig(
                ReservationConfig.newBuilder()
                    .setThroughputReservation(reservationPath.toString())
                    .build())
            .setName(topicPath.toString())
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic response = adminClient.createTopic(topic).get();
      if (regional) {
        System.out.println(response.getAllFields() + " (regional topic) created successfully.");
      } else {
        System.out.println(response.getAllFields() + " (zonal topic) created successfully.");
      }
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (AlreadyExistsException alreadyExists) {
        System.out.println("This topic already exists.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Python の設定手順を実施してください。

from google.api_core.exceptions import AlreadyExists
from google.cloud.pubsublite import AdminClient, Topic
from google.cloud.pubsublite.types import (
    CloudRegion,
    CloudZone,
    ReservationPath,
    TopicPath,
)
from google.protobuf.duration_pb2 import Duration

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# zone_id = "a"
# topic_id = "your-topic-id"
# reservation_id = "your-reservation-id"
# num_partitions = 1
# regional = True

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

topic_path = None
if regional:
    #  A regional topic.
    topic_path = TopicPath(project_number, cloud_region, topic_id)
else:
    #  A zonal topic
    topic_path = TopicPath(
        project_number, CloudZone(cloud_region, zone_id), topic_id
    )

topic = Topic(
    name=str(topic_path),
    partition_config=Topic.PartitionConfig(
        # A topic must have at least one partition.
        count=num_partitions,
        # Set throughput capacity per partition in MiB/s.
        capacity=Topic.PartitionConfig.Capacity(
            # Set publish throughput capacity per partition to 4 MiB/s. Must be >= 4 and <= 16.
            publish_mib_per_sec=4,
            # Set subscribe throughput capacity per partition to 4 MiB/s. Must be >= 4 and <= 32.
            subscribe_mib_per_sec=8,
        ),
    ),
    retention_config=Topic.RetentionConfig(
        # Set storage per partition to 30 GiB. This must be in the range 30 GiB-10TiB.
        # If the number of byptes stored in any of the topic's partitions grows beyond
        # this value, older messages will be dropped to make room for newer ones,
        # regardless of the value of `period`.
        per_partition_bytes=30 * 1024 * 1024 * 1024,
        # Allow messages to be retained for 7 days.
        period=Duration(seconds=60 * 60 * 24 * 7),
    ),
    reservation_config=Topic.ReservationConfig(
        throughput_reservation=str(reservation_path),
    ),
)

client = AdminClient(cloud_region)
try:
    response = client.create_topic(topic)
    if regional:
        print(f"{response.name} (regional topic) created successfully.")
    else:
        print(f"{response.name} (zonal topic) created successfully.")
except AlreadyExists:
    print(f"{topic_path} already exists.")

Lite トピックを作成した後は、パーティションごとのスループットとストレージ容量をスケーリングできます。パーティション数は増やすことはできますが、減らすことはできません。

Lite トピックを更新する

Lite トピックの次のプロパティを更新できます。

  • Lite トピックに関連付けられた予約

  • トピック内のパーティションの数(増加のみ可能)

  • パブリッシュとサブスクライブのスループット容量の上限

  • パーティションあたりのストレージ

  • メッセージ保持のタイプ

トピックのスループット容量またはストレージ容量をスケーリングする前に、スループット容量をスケーリングするストレージ容量をスケーリングするをご覧ください。

Lite トピックは、Google Cloud コンソール、Google Cloud CLI、または Pub/Sub Lite API を使用して更新できます。

Console

  1. [Lite トピック] ページに移動します。

    [Lite トピック] に移動

  2. [Lite トピック ID] をクリックします。

  3. [編集] をクリックします。

  4. 次のいずれかまたはすべての更新を行うことができます。

    • 別の予約を使用する。ゾーントピックの場合は、予約を使用しないことを選択できます。
    • パーティション数を入力する。この値は増やすことはできますが、減らすことはできません。
    • パブリッシュとサブスクライブの最大許容スループットを有効または無効にする。
    • ゾーントピックの場合は、予約済みのパブリッシュとサブスクライブのスループットを更新する。トピックに予約が関連付けられている場合、更新されたスループットには新しい上限が反映されます。
    • パーティションあたりのストレージ容量を編集する。
    • メッセージの保持期間を編集する。
  5. [更新] をクリックします。

gcloud

Lite トピックを更新するには、gcloud pubsub lite-topics update コマンドを使用します。

gcloud pubsub lite-topics update TOPIC_ID \
  --location=LOCATION \
  --partitions=NUMBER_OF_PARTITIONS \
  --per-partition-publish-mib=publish_CAPACITY \
  --per-partition-subscribe-mib=subscribe_CAPACITY \
  --per-partition-bytes=STORAGE_PER_PARTITION \
  --message-retention-period=MESSAGE_RETENTION_PERIOD

以下を置き換えます。

  • TOPIC_ID: Lite トピックの ID

  • LOCATION: Lite トピックが存在しているロケーションの名前

  • NUMBER_OF_PARTITIONS: Lite トピックに構成するパーティションの数

  • publish_CAPACITY: 各パーティションのパブリッシュ スループット容量を表す整数

  • subscribe_CAPACITY: 各パーティションのサブスクライブ スループット容量を表す整数

  • STORAGE_PER_PARTITION: 各パーティションのストレージ容量(30GiB など)

  • MESSAGE_RETENTION_PERIOD: Lite トピックがメッセージを保存する期間(1d2w など)

リクエストが成功すると、コマンドラインに Lite トピックが表示されます。

name: projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
partitionConfig:
  count: NUMBER_OF_PARTITIONS
  capacity:
    publishMibPerSec: publish_CAPACITY
    subscribeMibPerSec: subscribe_CAPACITY
retentionConfig:
  perPartitionBytes: STORAGE_PER_PARTITION
  period: MESSAGE_RETENTION_PERIOD

プロトコル

Lite トピックを更新するには、次のような PATCH リクエストを送信します。

PATCH https://REGION-pubsublite.googleapis.com/v1/admin/projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID?updateMask=partitionConfig.capacity,retentionConfig.perPartitionBytes,retentionConfig.period,partitionConfig.count
Authorization: Bearer $(gcloud auth print-access-token)

次のように置き換えます。

  • REGION: Lite トピックが配置されているリージョン

  • PROJECT_NUMBER: Lite トピックのプロジェクトのプロジェクト番号

  • LOCATION: Lite トピックが存在しているロケーションの名前

  • TOPIC_ID: Lite トピックの ID

リクエスト本文に次のフィールドを指定します。

{
  "partitionConfig": {
      "count": NUMBER_OF_PARTITIONS,
      "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
      }
   },
   "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
   },
}

次のように置き換えます。

  • publish_CAPACITY: 各パーティションのパブリッシュ スループット容量を表す整数

  • subscribe_CAPACITY: 各パーティションのサブスクライブ スループット容量を表す整数

  • STORAGE_PER_PARTITION: 各パーティションのストレージ容量(30GiB など)

  • MESSAGE_RETENTION_PERIOD: Lite トピックがメッセージを保存する期間(1d2w など)

  • NUMBER_OF_PARTITIONS: Lite トピックに構成するパーティションの数

リクエストが成功すると、レスポンスは JSON 形式の Lite トピックになります。

{
  "name": projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID,
  "partitionConfig": {
      "count": NUMBER_OF_PARTITIONS,
      "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
      }
   },
   "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
   },
}

Go

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Go の設定手順を実施してください。

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/pubsublite"
)

func updateTopic(w io.Writer, projectID, region, location, topicID, reservation string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	// reservation := "projects/my-project-id/reservations/my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	// For ranges of fields in TopicConfigToUpdate, see https://pkg.go.dev/cloud.google.com/go/pubsublite/#TopicConfigToUpdate
	config := pubsublite.TopicConfigToUpdate{
		Name:                       topicPath,
		PartitionCount:             3, // Partition count cannot decrease.
		PublishCapacityMiBPerSec:   8,
		SubscribeCapacityMiBPerSec: 16,
		PerPartitionBytes:          60 * 1024 * 1024 * 1024,
		RetentionDuration:          24 * time.Hour,
		ThroughputReservation:      reservation,
	}
	updatedCfg, err := client.UpdateTopic(ctx, config)
	if err != nil {
		return fmt.Errorf("client.UpdateTopic got err: %w", err)
	}
	fmt.Fprintf(w, "Updated topic: %v\n", updatedCfg)
	return nil
}

Java

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Java の設定手順を実施してください。

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig.Capacity;
import com.google.cloud.pubsublite.proto.Topic.ReservationConfig;
import com.google.cloud.pubsublite.proto.Topic.RetentionConfig;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.Durations;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

public class UpdateTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    String topicId = "your-topic-id";
    String reservationId = "your-reservation-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    updateTopicExample(cloudRegion, zoneId, projectNumber, topicId, reservationId, regional);
  }

  public static void updateTopicExample(
      String cloudRegion,
      char zoneId,
      long projectNumber,
      String topicId,
      String reservationId,
      boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    Iterable<String> iterablePaths =
        Arrays.asList(
            "partition_config.scale",
            "retention_config.per_partition_bytes",
            "retention_config.period",
            "reservation_config.throughput_reservation");

    FieldMask fieldMask = FieldMask.newBuilder().addAllPaths(iterablePaths).build();

    Topic topic =
        Topic.newBuilder()
            .setPartitionConfig(
                PartitionConfig.newBuilder()
                    .setCapacity(
                        Capacity.newBuilder()
                            .setPublishMibPerSec(16)
                            .setSubscribeMibPerSec(32)
                            .build())
                    .build())
            .setRetentionConfig(
                RetentionConfig.newBuilder()
                    // Set storage per partition to 32 GiB. This must be 30 GiB-10 TiB.
                    // If the number of bytes stored in any of the topic's partitions grows
                    // beyond this value, older messages will be dropped to make room for
                    // newer ones, regardless of the value of `period`.
                    // Be careful when decreasing storage per partition as it may cause
                    // lost messages.
                    .setPerPartitionBytes(32 * 1024 * 1024 * 1024L)
                    .setPeriod(Durations.fromDays(7)))
            .setReservationConfig(
                ReservationConfig.newBuilder()
                    .setThroughputReservation(reservationPath.toString())
                    .build())
            .setName(topicPath.toString())
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic topicBeforeUpdate = adminClient.getTopic(topicPath).get();
      System.out.println("Before update: " + topicBeforeUpdate.getAllFields());

      Topic topicAfterUpdate = adminClient.updateTopic(topic, fieldMask).get();
      System.out.println("After update: " + topicAfterUpdate.getAllFields());
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Python の設定手順を実施してください。

from google.api_core.exceptions import NotFound
from google.cloud.pubsublite import AdminClient, Topic
from google.cloud.pubsublite.types import (
    CloudRegion,
    CloudZone,
    ReservationPath,
    TopicPath,
)
from google.protobuf.duration_pb2 import Duration
from google.protobuf.field_mask_pb2 import FieldMask

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# zone_id = "a"
# topic_id = "your-topic-id"
# reservation_id = "your-reservation-id"
# regional = True

location = None
if regional:
    #  A region.
    location = CloudRegion(cloud_region)
else:
    #  A zone.
    location = CloudZone(CloudRegion(cloud_region), zone_id)

topic_path = TopicPath(project_number, location, topic_id)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

# Defines which topic fields to update.
field_mask = FieldMask(
    paths=[
        "partition_config.capacity",
        "retention_config.per_partition_bytes",
        "retention_config.period",
        "reservation_confing.throughput_reservation",
    ]
)

# Defines how to update the topic fields.
topic = Topic(
    name=str(topic_path),
    partition_config=Topic.PartitionConfig(
        capacity=Topic.PartitionConfig.Capacity(
            publish_mib_per_sec=16,
            subscribe_mib_per_sec=32,
        )
    ),
    retention_config=Topic.RetentionConfig(
        # Set storage per partition to 32 GiB. This must be in the range 30 GiB-10TiB.
        # If the number of byptes stored in any of the topic's partitions grows beyond
        # this value, older messages will be dropped to make room for newer ones,
        # regardless of the value of `period`.
        # Be careful when decreasing storage per partition as it may cuase lost messages.
        per_partition_bytes=32 * 1024 * 1024 * 1024,
        # Allow messages to be stored for 14 days.
        period=Duration(seconds=60 * 60 * 24 * 14),
    ),
    reservation_config=Topic.ReservationConfig(
        throughput_reservation=str(reservation_path),
    ),
)

client = AdminClient(cloud_region)
try:
    response = client.update_topic(topic, field_mask)
    print(f"{response.name} updated successfully.")
except NotFound:
    print(f"{topic_path} not found.")

Lite トピックの詳細を表示する

Lite トピックの詳細は、Google Cloud コンソール、Google Cloud CLI、または Pub/Sub Lite API を使用して取得できます。

Console

  1. [Lite トピック] ページに移動します。

    [Lite トピック] に移動

  2. [Lite トピック ID] をクリックします。

gcloud

Lite トピックの詳細を取得するには、gcloud pubsub lite-topics describe コマンドを使用します。

gcloud pubsub lite-topics describe TOPIC_ID \
--location=LOCATION

以下を置き換えます。

  • TOPIC_ID: Lite トピックの ID

  • LOCATION: Lite トピックが存在しているロケーションの名前

リクエストが成功すると、コマンドラインに Lite トピックが表示されます。

name: projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
partitionConfig:
  count: NUMBER_OF_PARTITIONS
  capacity:
    publishMibPerSec: publish_CAPACITY
    subscribeMibPerSec: subscribe_CAPACITY
retentionConfig:
  perPartitionBytes: STORAGE_PER_PARTITION
  period: MESSAGE_RETENTION_PERIOD

プロトコル

Lite トピックの詳細を取得するには、次のような GET リクエストを送信します。

GET https://REGION-pubsublite.googleapis.com/v1/admin/projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
Authorization: Bearer $(gcloud auth print-access-token)

次のように置き換えます。

  • REGION: Lite トピックが配置されているリージョン

  • PROJECT_NUMBER: Lite トピックのプロジェクトのプロジェクト番号

  • LOCATION: Lite トピックが存在しているロケーションの名前

  • TOPIC_ID: Lite トピックの ID

リクエストが成功すると、レスポンスは JSON 形式の Lite トピックになります。

{
  "name": projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID,
  "partitionConfig": {
      "count": NUMBER_OF_PARTITIONS,
      "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
      }
   },
   "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
   },
}

Go

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Go の設定手順を実施してください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func getTopic(w io.Writer, projectID, region, location, topicID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	topic, err := client.Topic(ctx, topicPath)
	if err != nil {
		return fmt.Errorf("client.Topic got err: %w", err)
	}
	fmt.Fprintf(w, "Got topic: %#v\n", *topic)
	return nil
}

Java

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Java の設定手順を実施してください。

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import java.util.concurrent.ExecutionException;

public class GetTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    // Choose an existing topic.
    String topicId = "your-topic-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    getTopicExample(cloudRegion, zoneId, projectNumber, topicId, regional);
  }

  public static void getTopicExample(
      String cloudRegion, char zoneId, long projectNumber, String topicId, boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic topic = adminClient.getTopic(topicPath).get();
      long numPartitions = adminClient.getTopicPartitionCount(topicPath).get();
      System.out.println(topic.getAllFields() + "\nhas " + numPartitions + " partition(s).");
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Python の設定手順を実施してください。

from google.api_core.exceptions import NotFound
from google.cloud.pubsublite import AdminClient
from google.cloud.pubsublite.types import CloudRegion, CloudZone, TopicPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# zone_id = "a"
# topic_id = "your-topic-id"
# regional = True

location = None
if regional:
    #  A region.
    location = CloudRegion(cloud_region)
else:
    #  A zone.
    location = CloudZone(CloudRegion(cloud_region), zone_id)

topic_path = TopicPath(project_number, location, topic_id)

client = AdminClient(cloud_region)
try:
    response = client.get_topic(topic_path)
    num_partitions = client.get_topic_partition_count(topic_path)
    print(f"{response.name} has {num_partitions} partition(s).")
except NotFound:
    print(f"{topic_path} not found.")

Lite トピックのリスト表示

Google Cloud コンソール、Google Cloud CLI、または Pub/Sub Lite API を使用して、プロジェクト内の Lite トピックを一覧表示できます。

Console

  • プロジェクトの Lite トピックのリストを表示するには、[Lite トピック] ページに移動します。

    [Lite トピック] に移動

gcloud

gcloud pubsub lite-topics list \
  --location=LOCATION

LOCATION は、Lite トピックが配置されているロケーションの名前に置き換えます。

リクエストが成功すると、コマンドラインに Lite トピックが表示されます。

---
name: projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
partitionConfig:
  count: NUMBER_OF_PARTITIONS
  capacity:
    publishMibPerSec: publish_CAPACITY
    subscribeMibPerSec: subscribe_CAPACITY
retentionConfig:
  perPartitionBytes: STORAGE_PER_PARTITION
  period: MESSAGE_RETENTION_PERIOND
---
name: projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
partitionConfig:
  count: NUMBER_OF_PARTITIONS
  capacity:
    publishMibPerSec: publish_CAPACITY
    subscribeMibPerSec: subscribe_CAPACITY
retentionConfig:
  perPartitionBytes: STORAGE_PER_PARTITION
  period: MESSAGE_RETENTION_PERIOND

プロトコル

プロジェクト内の Lite トピックを一覧表示するには、次のように GET リクエストを送信します。

GET https://REGION-pubsublite.googleapis.com/v1/admin/projects/PROJECT_NUMBER/topics
Authorization: Bearer $(gcloud auth print-access-token)

次のように置き換えます。

  • REGION: Lite トピックが配置されているリージョン

  • PROJECT_NUMBER: Lite トピックのプロジェクトのプロジェクト番号

リクエストが成功すると、Lite トピックのリストが JSON 形式で返されます。

{
  "topics": [
      {
          "name": "projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID",
      },
      {
          "name": "projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID",
      }
  ]
}

Go

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Go の設定手順を実施してください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
	"google.golang.org/api/iterator"
)

func listTopics(w io.Writer, projectID, region, zone string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// zone := "us-central1-a"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	parent := fmt.Sprintf("projects/%s/locations/%s", projectID, zone)
	topicIter := client.Topics(ctx, parent)
	for {
		topic, err := topicIter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("topicIter.Next got err: %w", err)
		}
		fmt.Fprintf(w, "Got topic: %#v\n", topic)
	}
	return nil
}

Java

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Java の設定手順を実施してください。

import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.LocationPath;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.proto.Topic;
import java.util.List;

public class ListTopicsExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    listTopicsExample(cloudRegion, zoneId, projectNumber, regional);
  }

  public static void listTopicsExample(
      String cloudRegion, char zoneId, long projectNumber, boolean regional) throws Exception {

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    LocationPath locationPath =
        LocationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      List<Topic> topics = adminClient.listTopics(locationPath).get();
      for (Topic topic : topics) {
        System.out.println(topic.getAllFields());
      }
      System.out.println(topics.size() + " topic(s) listed.");
    }
  }
}

Python

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Python の設定手順を実施してください。

from google.cloud.pubsublite import AdminClient
from google.cloud.pubsublite.types import CloudRegion, CloudZone, LocationPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# zone_id = "a"
# regional = True

location = None
if regional:
    #  A region.
    location = CloudRegion(cloud_region)
else:
    #  A zone.
    location = CloudZone(CloudRegion(cloud_region), zone_id)

location_path = LocationPath(project_number, location)

client = AdminClient(cloud_region)
response = client.list_topics(location_path)

for topic in response:
    print(topic)

print(f"{len(response)} topic(s) listed in your project and location.")

Lite トピックを削除する

Lite トピックは、Google Cloud コンソール、Google Cloud CLI、または Pub/Sub Lite API を使用して削除できます。

Console

  1. [Lite トピック] ページに移動します。

    [Lite トピック] に移動

  2. [Lite トピック ID] をクリックします。

  3. [Lite トピックの詳細] ページで [削除] をクリックします。

  4. 表示されるフィールドに、「delete」と入力して削除する Lite トピックを確定します。

  5. [削除] をクリックします。

gcloud

Lite トピックを削除するには、gcloud pubsub lite-topics delete コマンドを使用します。

  1. delete コマンドを実行します。

    gcloud pubsub lite-topics delete TOPIC_ID \
     --location=LOCATION
    

    以下を置き換えます。

    • TOPIC_ID: Lite トピックの ID

    • LOCATION: Lite トピックが存在しているロケーションの名前

  2. 確定するには「Y」と入力します。

リクエストが成功した場合のレスポンスは、次のようになります。

Deleted topic [TOPIC_ID].

プロトコル

Lite トピックを削除するには、次のような DELETE リクエストを送信します。

DELETE https://REGION-pubsublite.googleapis.com/v1/admin/projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
Authorization: Bearer $(gcloud auth print-access-token)

次のように置き換えます。

  • REGION: Lite トピックが配置されているリージョン

  • PROJECT_NUMBER: Lite トピックのプロジェクトのプロジェクト番号

  • LOCATION: Lite トピックが存在しているロケーションの名前

  • TOPIC_ID: Lite トピックの ID

リクエストが成功した場合のレスポンスは空の JSON オブジェクトです。

Go

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Go の設定手順を実施してください。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func deleteTopic(w io.Writer, projectID, region, location, topicID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	err = client.DeleteTopic(ctx, topicPath)
	if err != nil {
		return fmt.Errorf("client.DeleteTopic got err: %w", err)
	}
	fmt.Fprint(w, "Deleted topic\n")
	return nil
}

Java

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Java の設定手順を実施してください。

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import java.util.concurrent.ExecutionException;

public class DeleteTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    // Choose an existing topic.
    String topicId = "your-topic-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = false;

    deleteTopicExample(cloudRegion, zoneId, projectNumber, topicId, regional);
  }

  public static void deleteTopicExample(
      String cloudRegion, char zoneId, long projectNumber, String topicId, boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      adminClient.deleteTopic(topicPath).get();
      if (regional) {
        System.out.println(topicPath.toString() + " (regional topic) deleted successfully.");
      } else {
        System.out.println(topicPath.toString() + " (zonal topic) deleted successfully.");
      }
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }

Python

このサンプルを実行する前に、Pub/Sub Lite クライアント ライブラリの Python の設定手順を実施してください。

from google.api_core.exceptions import NotFound
from google.cloud.pubsublite import AdminClient
from google.cloud.pubsublite.types import CloudRegion, CloudZone, TopicPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# zone_id = "a"
# topic_id = "your-topic-id"
# regional = True

cloud_region = CloudRegion(cloud_region)
topic_path = None
if regional:
    #  A regional topic.
    topic_path = TopicPath(project_number, cloud_region, topic_id)
else:
    #  A zonal topic
    topic_path = TopicPath(
        project_number, CloudZone(cloud_region, zone_id), topic_id
    )

client = AdminClient(cloud_region)
try:
    client.delete_topic(topic_path)
    if regional:
        print(f"{topic_path} (regional topic) deleted successfully.")
    else:
        print(f"{topic_path} (zonal topic) deleted successfully.")
except NotFound:
    print(f"{topic_path} not found.")

Lite トピックを削除すると、そのトピックにメッセージをパブリッシュすることはできません。Lite トピックの Lite サブスクリプションは引き続き存在しますが、Lite サブスクリプションからメッセージを受信することはできません。

次のステップ