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 tempat penayang dapat mengirim pesan agar pelanggan dapat menerima pesan tersebut. Dalam Pub/Sub Lite, Anda dapat memilih untuk membuat topik Lite zona atau regional.

Topik Lite di level zona dan topik Lite di level region hanya berbeda dalam cara mereplika data. Semua properti topik lainnya sama seperti yang dijelaskan di bagian selanjutnya dalam dokumen ini.

Replikasi data di topik Lite

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

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

Ketersediaan topik zonal 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 tidak akan tersedia selama pemadaman layanan.

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

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

  • Jika frontend dan penyimpanan aplikasi mengalami kegagalan zona, topik Lite regional akan tetap tersedia selama kedua komponen tidak mulai gagal secara bersamaan.

  • Jika frontend dan penyimpanan aplikasi gagal secara bersamaan, topik Lite regional tetap tidak tersedia selama pemadaman layanan. Selama waktu ini, klien mungkin gagal memublikasikan atau menggunakan pesan, tetapi pesan masih 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 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 keparalelan dasar di Pub/Sub Lite. Topik Lite dapat memiliki satu atau beberapa partisi.

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

    • Throughput publikasi (MiBps). Frekuensi maksimum untuk memublikasikan pesan.

    • Throughput langganan (MiBps). Kecepatan maksimum pesan 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 yang dikonfigurasi 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 agregat dapat mendukung throughput publikasi sebesar 1 GiBps, batas publikasi per partisilah yang secara efektif membatasi throughput.

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

  • Reservasi. Pemesanan adalah cara termudah untuk menyediakan dan mengelola kapasitas throughput untuk sejumlah topik. Menyediakan kapasitas throughput dengan pemesanan diperlukan untuk Lite regional dan opsional untuk topik Lite zonal.

    Jika tidak menggunakan pemesanan untuk topik Lite zonal, Anda harus menyediakan kapasitas throughput publikasi dan langganan topik secara eksplisit. Tanpa pemesanan, semua partisi dalam topik Lite memiliki kapasitas throughput yang dikonfigurasi sama. Untuk mengetahui lebih lanjut, 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 melampaui 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 di level region menggunakan kapasitas penyimpanan dua byte untuk setiap byte yang dipublikasikan. Topik Lite zonal 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 membuat lebih banyak kapasitas penyimpanan, pesan terlama dari partisi akan dihapus. Penghapusan pesan terlama terjadi meskipun pesan berada dalam periode retensi pesan. Layanan ini tidak pernah menghapus pesan sebelum TTL-nya berakhir, kecuali jika penghapusan 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 hubung -, 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 di 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 pemesanan Lite, Anda dapat menetapkan kapasitas throughput setiap partisi topik Lite zonal ke nilai yang ditetapkan oleh batas berikut:

  • Throughput publikasi antara 4 dan 16 MiBps

  • Throughput langganan antara 4 dan 32 MiBps

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

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

Saat Anda mengubah jumlah partisi, urutan pesan relatif 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 pembaruan jumlah partisi kemungkinan akan dipetakan ke partisi yang berbeda dengan yang dipublikasikan sebelum pembaruan.

Selain itu, pengubahan ukuran topik memerlukan waktu beberapa detik untuk diterapkan ke semua penerbit. Ada waktu singkat saat beberapa penayang menggunakan fungsi hash baru dan beberapa masih menggunakan fungsi lama.

Meningkatkan kapasitas penyimpanan topik Lite

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

Jika Anda mengurangi jumlah penyimpanan di topik Lite, layanan Pub/Sub Lite akan menghapus pesan yang paling lama terlebih dahulu.

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 mengetahui 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 zonal, pilih region dan zona dalam region.

    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 mencakup ID topik Lite, lokasi, dan nomor project.

  4. Di bagian Throughput:

    1. Pilih atau buat reservasi.

      Ini bersifat opsional untuk topik Lite di level zona dan wajib untuk topik Lite di level region.

    2. Masukkan throughput publikasi puncak dan throughput langganan puncak.

      Sejumlah partisi ditetapkan secara otomatis berdasarkan input Anda. Anda dapat mengedit nomor ini setelah menyimpan topik.

  5. Di bagian Penyimpanan pesan:

    1. Masukkan penyimpanan per partisi.

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

  6. Tinjau perubahan, 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 dari pemesanan 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 setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan setiap partisi

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

  • RESERVATION_NAME: jalur yang sepenuhnya memenuhi syarat dari pemesanan 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 per partisi dan kapasitas penyimpanan. Anda juga dapat meningkatkan, 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 Anda menskalakan kapasitas throughput atau kapasitas penyimpanan topik, lihat Menskalakan kapasitas throughput dan Menskalakan kapasitas penyimpanan.

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 pembaruan berikut:

    • Gunakan reservasi lain. Untuk topik zonal, Anda dapat memilih untuk tidak menggunakan reservasi.
    • Masukkan jumlah partisi. Nilai ini dapat ditingkatkan, tetapi tidak dapat dikurangi.
    • Aktifkan atau nonaktifkan throughput publikasi dan langganan maksimum yang diizinkan.
    • Untuk topik zonal, perbarui throughput publikasi dan langganan yang direservasi. Untuk topik yang memiliki reservasi yang terlampir, throughput yang diperbarui akan mencerminkan batas maksimum yang 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 setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan 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 dari 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 setiap partisi

  • subscribe_CAPACITY: bilangan bulat untuk kapasitas throughput langganan 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.")

Melihat detail topik Lite

Anda bisa mendapatkan detail tentang topik Lite menggunakan 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.

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 dari 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 mencantumkan topik Lite dalam project menggunakan konsol Google Cloud, Google Cloud CLI, atau Pub/Sub Lite API.

Konsol

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

    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 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 dari 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 Hapus.

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

  5. Klik Hapus.

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 dari 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 menghapus topik Lite, 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