Membuat dan mengelola topik Lite

Dokumen ini menjelaskan cara membuat, melihat, dan menghapus topik Pub/Sub Lite.

Ringkasan topik Lite

Layanan Pub/Sub Lite memerlukan topik yang dapat digunakan penerbit untuk mengirim pesan agar pelanggan dapat menerima pesan tersebut. Dalam Pub/Sub Lite, Anda dapat memilih untuk membuat topik Lite zona atau regional.

Lite zona dan topik Lite regional hanya berbeda dalam cara mereka mereplikasi data. Semua properti topik lainnya sama seperti yang dijelaskan di bagian selanjutnya dalam dokumen ini.

Replikasi data dalam topik Lite

Topik regional Pub/Sub Lite menyimpan data di dua zona dari satu region. Topik zona Pub/Sub Lite mereplikasi data hanya dalam satu zona. Pub/Sub Lite mereplikasi data secara asinkron.

Ketersediaan Pub/Sub Lite bergantung pada ketersediaan komponen yang mendasarinya, yang mencakup frontend dan penyimpanan aplikasi.

Ketersediaan topik zona Pub/Sub Lite bergantung pada ketersediaan frontend dan penyimpanan aplikasi di zona yang dikonfigurasi. Jika frontend atau penyimpanan aplikasi mengalami kegagalan zona, topik Lite zona akan menjadi tidak tersedia selama pemadaman layanan.

Ketersediaan topik regional Pub/Sub Lite bergantung pada ketersediaan frontend dan penyimpanan aplikasi di region yang dikonfigurasi. Jenis kegagalan berikut mungkin terjadi:

  • Jika frontend aplikasi atau penyimpanan mengalami kegagalan zona, topik Lite regional tetap tersedia.

  • Jika frontend aplikasi dan penyimpanan mengalami kegagalan zona, topik Lite regional akan tetap tersedia selama kedua komponen tidak mulai gagal pada saat yang sama.

  • Jika frontend dan penyimpanan aplikasi gagal secara bersamaan, topik Lite regional akan tetap tidak tersedia selama pemadaman layanan. Selama waktu ini, klien mungkin gagal memublikasikan atau menggunakan pesan, tetapi pesan tetap dikirim dalam urutan yang benar.

Topik Lite regional memberikan perlindungan dari sebagian besar jenis kegagalan zona tunggal. Namun, dalam beberapa kasus yang jarang terjadi, sifat asinkron replikasi dapat menyebabkan kegagalan simultan pada beberapa komponen dalam satu zona. Akibatnya, topik Lite regional menjadi tidak tersedia.

Properti topik Lite

Topik Lite memiliki properti berikut:

  • Jumlah partisi. Partisi adalah unit dasar paralelisme di Pub/Sub Lite. Topik Lite dapat memiliki satu atau beberapa partisi.

  • Kapasitas partisi. Kapasitas partisi dijelaskan oleh tiga properti berikut:

    • Throughput publikasi (MiBps). Tingkat maksimum pesan yang dapat Anda publikasikan.

    • Throughput langganan (MiBps). Tingkat maksimum pesan yang diteruskan ke langganan Lite.

    • Penyimpanan (GiB). Ukuran maksimum pesan dalam partisi. Kapasitas minimum partisi yang dapat dikonfigurasi adalah 30 GiB.

  • Kapasitas penyimpanan topik Lite. Semua partisi dalam topik Lite memiliki kapasitas penyimpanan terkonfigurasi yang sama. Total kapasitas penyimpanan topik Lite adalah jumlah kapasitas penyimpanan semua partisi dalam topik. Misalnya, jika topik Lite memiliki 8 partisi dan setiap partisi berukuran 30 GiB, total kapasitas penyimpanan topik Lite adalah 240 GiB (8 x 30).

  • Kapasitas throughput topik Lite. Kapasitas throughput terdiri dari total kapasitas throughput publikasi dan langganan dari semua partisi dalam topik Lite. Meskipun Anda memiliki topik yang, secara gabungan, dapat mendukung throughput publikasi 1 GiBps, batas publikasi per partisi yang secara efektif membatasi throughput.

  • Batasan klien pelanggan dan langganan. Pub/Sub Lite mendukung satu klien pelanggan untuk satu partisi dan satu langganan. Misalnya, langganan ke topik dengan 5 partisi dapat memiliki maksimum 5 klien pelanggan yang menggunakan pesan darinya. Jika lebih banyak klien pelanggan dikonfigurasi, kelebihan klien tersebut akan tetap tidak ada aktivitas. Topik yang sama dengan 2 langganan dapat memiliki maksimal 10 klien pelanggan, 5 klien untuk setiap langganan.

  • Reservasi. Reservasi adalah cara termudah untuk menyediakan dan mengelola kapasitas throughput untuk sejumlah topik. Penyediaan kapasitas throughput dengan reservasi wajib untuk Lite regional dan opsional untuk topik Lite zona.

    Jika tidak menggunakan reservasi untuk topik Lite zona, Anda harus secara eksplisit menyediakan kapasitas throughput publikasi dan langganan topik. Tanpa reservasi, semua partisi dalam topik Lite memiliki kapasitas throughput terkonfigurasi yang sama. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi kapasitas throughput tanpa reservasi.

  • Konfigurasi penyimpanan. Untuk mengonfigurasi penyimpanan, Anda harus menentukan kapasitas penyimpanan dan, secara opsional, periode retensi pesan.

    • Periode retensi pesan. Jumlah waktu maksimum yang digunakan topik Lite untuk menyimpan pesan. Jika Anda tidak menentukan periode retensi pesan, topik Lite akan menyimpan pesan hingga Anda melebihi kapasitas penyimpanan.

    • Kapasitas penyimpanan. Kapasitas topik Pub/Sub Lite ditentukan oleh jumlah partisi dalam topik dan kapasitas penyimpanan setiap partisi. Penyimpanan per partisi adalah jumlah penyimpanan, dalam byte, untuk setiap partisi. Perhatikan bahwa topik Lite regional menggunakan kapasitas penyimpanan dua byte untuk setiap byte yang dipublikasikan. Topik Zonal Lite menggunakan kapasitas penyimpanan satu byte untuk setiap byte yang dipublikasikan.

    Jika Anda melebihi kapasitas penyimpanan, layanan Pub/Sub Lite akan terus memublikasikan pesan. Namun, untuk menambah kapasitas penyimpanan, pesan yang paling lama dari partisi akan dihapus. Penghapusan pesan yang paling lama terjadi meskipun pesan tersebut berada dalam periode retensi pesan. Layanan tidak pernah menghapus pesan sebelum TTL-nya berakhir, kecuali jika penghapusannya diperlukan untuk memberi ruang bagi pesan yang baru dipublikasikan. Untuk mengetahui informasi tentang hubungan kapasitas dengan harga, lihat Harga Pub/Sub Lite.

Panduan untuk memberi nama topik

Nama resource Pub/Sub Lite secara unik mengidentifikasi resource Pub/Sub Lite, seperti topik, langganan, atau reservasi. Nama resource harus sesuai dengan format berikut:

projects/project-identifier/collection/ID

  • project-identifier: Harus berupa project ID atau nomor project, yang tersedia dari Konsol Google Cloud. Misalnya, my-cool-project adalah project ID. 123456789123 adalah nomor project.

  • collection: Harus salah satu dari topics, subscriptions, atau reservations.

  • ID: Harus mematuhi panduan berikut:

    • Tidak diawali dengan string goog
    • Diawali dengan huruf
    • Berisi antara 3 hingga 255 karakter
    • Hanya berisi karakter berikut: Huruf [A-Za-z], angka [0-9], tanda pisah -, garis bawah _, titik ., tanda gelombang ~, tanda tambah +, dan tanda persen %

    Anda dapat menggunakan karakter khusus dalam daftar sebelumnya dalam nama resource tanpa encoding URL. Namun, Anda harus memastikan bahwa karakter khusus lainnya dienkode atau didekode dengan benar saat Anda menggunakannya dalam URL. Misalnya, mi-tópico adalah ID yang tidak valid. Namun, mi-t%C3%B3pico valid. Format ini penting saat Anda melakukan panggilan REST.

Meningkatkan kapasitas throughput topik Lite

Jika tidak menggunakan reservasi Lite, Anda dapat menetapkan kapasitas throughput setiap partisi topik Lite zona ke nilai yang ditetapkan oleh batas berikut:

  • Throughput publikasi antara 4 sampai 16 MiBps

  • Throughput langganan antara 4 sampai 32 MiBps

Batas ini juga berlaku untuk partisi yang terkait dengan reservasi Lite. Dengan reservasi, setiap partisi dapat menggunakan kapasitas throughput apa pun dalam batas yang ditentukan, selama total kapasitas reservasi tidak terlampaui. Anda juga dapat menetapkan batas yang lebih rendah pada throughput aktual per partisi untuk membuat traffic lebih dapat diprediksi.

Anda dapat menambah jumlah partisi dalam topik untuk menskalakannya secara horizontal. Jumlah partisi dalam topik tidak dapat dikurangi.

Jika Anda mengubah jumlah partisi, urutan relatif pesan tidak dipertahankan. Secara internal, pesan ditetapkan ke partisi menggunakan fungsi hash. Memperbarui jumlah partisi dalam topik akan mengubah fungsi hash ini. Pesan dengan kunci yang sama yang dipublikasikan setelah update jumlah partisi mungkin akan dipetakan ke partisi yang berbeda dari yang dipublikasikan sebelum update.

Selain itu, perubahan ukuran topik memerlukan waktu beberapa detik untuk diterapkan ke semua penayang. Terkadang ada beberapa penayang yang menggunakan fungsi hash yang baru, sementara sebagian masih menggunakan fungsi lama.

Meningkatkan kapasitas penyimpanan topik Lite

Anda dapat menambah atau mengurangi jumlah penyimpanan dalam topik Lite. Topik Lite menyediakan jumlah penyimpanan yang sama untuk setiap partisi. Jika Anda meningkatkan penyimpanan menjadi 60 GiB, masing-masing partisi akan mendapatkan penyimpanan sebesar 60 GiB.

Jika Anda mengurangi jumlah penyimpanan dalam topik Lite, layanan Pub/Sub Lite akan menghapus pesan terlama.

Untuk mengetahui informasi tentang hubungan kapasitas dengan harga, lihat Harga Pub/Sub Lite

Membuat topik Lite

Anda dapat membuat topik Lite dengan Konsol Google Cloud, Google Cloud CLI, atau Pub/Sub Lite API.

Untuk daftar region dan zona yang tersedia, lihat lokasi Pub/Sub Lite.

Konsol

  1. Buka halaman Lite Topics.

    Buka Topik Lite

  2. Klik Create Lite topic.

    1. Untuk membuat topik Lite zona, pilih region dan zona dalam region tersebut.

    2. Untuk membuat topik Lite regional, pilih region.

    Anda tidak dapat memperbarui lokasi setelah topik dibuat.

  3. Di bagian Name, masukkan ID topik Lite.

    Nama topik Lite menyertakan ID topik Lite, lokasi, dan nomor project.

  4. Di bagian throughput:

    1. Pilih atau buat reservasi.

      Hal ini opsional untuk topik Lite zona dan wajib untuk topik Lite regional.

    2. Masukkan throughput puncak publikasi dan puncak throughput langganan.

      Sejumlah partisi akan disetel otomatis berdasarkan input Anda. Anda dapat mengedit angka ini setelah menyimpan topik.

  5. Pada bagian Penyimpanan pesan:

    1. Masukkan penyimpanan per partisi.

    2. Pilih salah satu dari dua opsi untuk periode retensi pesan.

  6. Tinjau perubahannya, lalu klik Buat.

gcloud

Untuk membuat topik Lite, gunakan perintah 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]

Ganti kode berikut:

  • TOPIC_ID: ID topik Lite

  • LOCATION: nama lokasi yang didukung Pub/Sub Lite

  • NUMBER_OF_PARTITIONS: bilangan bulat untuk jumlah partisi dalam topik Lite

  • STORAGE_PER_PARTITION: jumlah penyimpanan untuk setiap partisi, seperti 30GiB

  • RESERVATION_NAME: jalur yang sepenuhnya memenuhi syarat reservasi Lite seperti projects/123456789/locations/us-west1/reservations/my-reservation

  • MESSAGE_RETENTION_PERIOD: jumlah waktu topik Lite menyimpan pesan, seperti 1d atau 2w

Jika permintaan berhasil, command line akan menampilkan konfirmasi:

Created [TOPIC_ID].

Protokol

Untuk membuat topik Lite, kirim permintaan POST seperti berikut:

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

Ganti kode berikut:

Tentukan kolom berikut dalam isi permintaan:

{
  "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
  }
}

Ganti kode berikut:

  • NUMBER_OF_PARTITIONS: bilangan bulat untuk jumlah partisi dalam topik Lite

  • STORAGE_PER_PARTITION: jumlah penyimpanan untuk setiap partisi, seperti 30GiB

  • publish_CAPACITY: bilangan bulat untuk kapasitas throughput publikasi dari setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan dari setiap partisi

  • MESSAGE_RETENTION_PERIOD: jumlah waktu topik Lite menyimpan pesan, seperti 1d atau 2w

  • RESERVATION_NAME: jalur yang sepenuhnya memenuhi syarat reservasi Lite seperti projects/123456789/locations/us-west1/reservations/my-reservation

Jika permintaan berhasil, responsnya adalah topik Lite dalam format JSON:

{
  "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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Go di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Java di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Python di Library Klien Pub/Sub Lite.

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.")

Setelah membuat topik Lite, Anda dapat menskalakan throughput dan kapasitas penyimpanan per partisi. Anda juga dapat menambah, tetapi tidak mengurangi jumlah partisi.

Memperbarui topik Lite

Anda dapat memperbarui properti topik Lite berikut:

  • Reservasi yang terkait dengan topik Lite

  • Jumlah partisi dalam topik (hanya dapat ditingkatkan)

  • Batas kapasitas throughput publikasi dan langganan

  • Penyimpanan per partisi

  • Jenis retensi pesan

Sebelum menskalakan kapasitas throughput atau kapasitas penyimpanan topik, lihat Kapasitas throughput skala dan Kapasitas penyimpanan skala.

Anda dapat memperbarui topik Lite dengan Konsol Google Cloud, Google Cloud CLI, atau Pub/Sub Lite API.

Konsol

  1. Buka halaman Lite Topics.

    Buka Topik Lite

  2. Klik ID topik Lite.

  3. Klik Edit.

  4. Anda dapat melakukan salah satu atau semua perubahan berikut:

    • Gunakan reservasi lain. Untuk topik zona, Anda dapat memilih untuk tidak menggunakan reservasi.
    • Masukkan jumlah partisi. Nilai ini dapat ditingkatkan tetapi tidak dapat diturunkan.
    • Mengaktifkan atau menonaktifkan throughput publikasi dan langganan maksimum yang diizinkan.
    • Untuk topik zona, perbarui throughput publikasi dan langganan yang dicadangkan. Untuk topik dengan reservasi terlampir, throughput yang diperbarui mencerminkan batas maksimum baru.
    • Edit kapasitas penyimpanan per partisi.
    • Edit periode retensi pesan.
  5. Klik Perbarui.

gcloud

Untuk memperbarui topik Lite, gunakan perintah 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

Ganti kode berikut:

  • TOPIC_ID: ID topik Lite

  • LOCATION: nama lokasi tempat topik Lite berada

  • NUMBER_OF_PARTITIONS: jumlah partisi yang akan dikonfigurasi untuk topik Lite.

  • publish_CAPACITY: bilangan bulat untuk kapasitas throughput publikasi dari setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan dari setiap partisi

  • STORAGE_PER_PARTITION: jumlah penyimpanan untuk setiap partisi, seperti 30GiB

  • MESSAGE_RETENTION_PERIOD: jumlah waktu topik Lite menyimpan pesan, seperti 1d atau 2w

Jika permintaan berhasil, command line akan menampilkan topik 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

Protokol

Untuk memperbarui topik Lite, kirim permintaan PATCH seperti berikut:

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)

Ganti kode berikut:

  • REGION: region tempat topik Lite berada

  • PROJECT_NUMBER: nomor project project dengan topik Lite

  • LOCATION: nama lokasi tempat topik Lite berada

  • TOPIC_ID: ID topik Lite

Tentukan kolom berikut dalam isi permintaan:

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

Ganti kode berikut:

  • publish_CAPACITY: bilangan bulat untuk kapasitas throughput publikasi dari setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan dari setiap partisi

  • STORAGE_PER_PARTITION: jumlah penyimpanan untuk setiap partisi, seperti 30GiB

  • MESSAGE_RETENTION_PERIOD: jumlah waktu topik Lite menyimpan pesan, seperti 1d atau 2w

  • NUMBER_OF_PARTITIONS: jumlah partisi yang akan dikonfigurasi untuk topik Lite.

Jika permintaan berhasil, responsnya adalah topik Lite dalam format JSON:

{
  "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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Go di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Java di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Python di Library Klien Pub/Sub Lite.

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.")

Lihat detail topik Lite

Anda bisa mendapatkan detail tentang topik Lite menggunakan Google Cloud Console, Google Cloud CLI, atau Pub/Sub Lite API.

Konsol

  1. Buka halaman Lite Topics.

    Buka Topik Lite

  2. Klik ID topik Lite.

gcloud

Untuk mendapatkan detail tentang topik Lite, gunakan perintah gcloud pubsub lite-topics describe:

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

Ganti kode berikut:

  • TOPIC_ID: ID topik Lite

  • LOCATION: nama lokasi tempat topik Lite berada

Jika permintaan berhasil, command line akan menampilkan topik 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

Protokol

Untuk mendapatkan detail tentang topik Lite, kirim permintaan GET seperti berikut:

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

Ganti kode berikut:

  • REGION: region tempat topik Lite berada

  • PROJECT_NUMBER: nomor project project dengan topik Lite

  • LOCATION: nama lokasi tempat topik Lite berada

  • TOPIC_ID: ID topik Lite

Jika permintaan berhasil, responsnya adalah topik Lite dalam format JSON:

{
  "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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Go di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Java di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Python di Library Klien Pub/Sub Lite.

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.")

Mencantumkan topik Lite

Anda dapat membuat daftar topik Lite dalam sebuah project menggunakan Konsol Google Cloud, Google Cloud CLI, atau Pub/Sub Lite API.

Konsol

  • Untuk melihat daftar topik Lite dalam sebuah project, buka halaman Topics Lite.

    Buka Topik Lite

gcloud

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

Ganti LOCATION dengan nama lokasi tempat topik Lite berada.

Jika permintaan berhasil, command line akan menampilkan topik 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

Protokol

Untuk mencantumkan topik Lite dalam sebuah project, kirim permintaan GET seperti berikut:

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

Ganti kode berikut:

  • REGION: region tempat topik Lite berada

  • PROJECT_NUMBER: nomor project project dengan topik Lite

Jika permintaan berhasil, responsnya adalah daftar topik Lite dalam format JSON:

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

Go

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Go di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Java di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Python di Library Klien Pub/Sub Lite.

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.")

Menghapus topik Lite

Anda dapat menghapus topik Lite dengan Konsol Google Cloud, Google Cloud CLI, atau Pub/Sub Lite API.

Konsol

  1. Buka halaman Lite Topics.

    Buka Topik Lite

  2. Klik ID topik Lite.

  3. Di halaman Detail topik Lite, klik Delete.

  4. Di kolom yang muncul, masukkan delete untuk mengonfirmasi bahwa Anda ingin menghapus topik Lite.

  5. Klik Delete.

gcloud

Untuk menghapus topik Lite, gunakan perintah gcloud pubsub lite-topics delete:

  1. Jalankan perintah delete:

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

    Ganti kode berikut:

    • TOPIC_ID: ID topik Lite

    • LOCATION: nama lokasi tempat topik Lite berada

  2. Untuk mengonfirmasi, ketik Y.

Jika permintaan berhasil, responsnya adalah sebagai berikut:

Deleted topic [TOPIC_ID].

Protokol

Untuk menghapus topik Lite, kirim permintaan DELETE seperti berikut:

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

Ganti kode berikut:

  • REGION: region tempat topik Lite berada

  • PROJECT_NUMBER: nomor project project dengan topik Lite

  • LOCATION: nama lokasi tempat topik Lite berada

  • TOPIC_ID: ID topik Lite

Jika permintaan berhasil, responsnya adalah objek JSON kosong.

Go

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Go di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Java di Library Klien Pub/Sub Lite.

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

Sebelum menjalankan contoh ini, ikuti petunjuk penyiapan Python di Library Klien Pub/Sub Lite.

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.")

Jika topik Lite dihapus, Anda tidak dapat memublikasikan pesan ke topik tersebut. Langganan Lite ke topik Lite masih ada, tetapi Anda tidak dapat menerima pesan dari langganan Lite.

Langkah Berikutnya