Lite-Themen erstellen und verwalten

In diesem Dokument wird erläutert, wie Sie ein Pub/Sub Lite-Thema erstellen, anzeigen lassen und löschen.

Lite-Thema – Übersicht

Für einen Pub/Sub Lite-Dienst ist ein Thema erforderlich, an das Verlage und Webpublisher Nachrichten senden können, damit Abonnenten diese Nachrichten empfangen können. In Pub/Sub Lite können Sie ein zonales oder regionales Lite-Thema erstellen.

Ein zonales Lite- und ein regionales Lite-Thema unterscheiden sich nur in der Art und Weise, wie sie Daten replizieren. Alle anderen Themeneigenschaften sind identisch mit den Beschreibungen in einem späteren Abschnitt dieses Dokuments.

Datenreplikation in einem Lite-Thema

Regionale Pub/Sub Lite-Themen speichern Daten in zwei Zonen einer einzelnen Region. Zonale Pub/Sub Lite-Themen replizieren Daten nur innerhalb einer Zone. Pub/Sub Lite repliziert Daten asynchron.

Die Verfügbarkeit von Pub/Sub Lite hängt von der Verfügbarkeit der zugrunde liegenden Komponenten ab, zu denen sowohl das Frontend der Anwendung als auch der Speicher gehören.

Die Verfügbarkeit eines zonalen Pub/Sub Lite-Themas hängt von der Verfügbarkeit des Frontend der Anwendung und des Speichers in der konfigurierten Zone ab. Wenn im Frontend oder Speicher der Anwendung ein zonaler Ausfall auftritt, ist das zonale Lite-Thema für die Dauer des Ausfalls nicht verfügbar.

Die Verfügbarkeit eines regionalen Pub/Sub Lite-Themas hängt von der Verfügbarkeit des Anwendungs-Front-Ends und des Speichers in der konfigurierten Region ab. Die folgenden Fehlertypen sind möglich:

  • Wenn beim Frontend oder Speicher der Anwendung ein zonaler Ausfall auftritt, bleibt das regionale Lite-Thema verfügbar.

  • Wenn sowohl beim Frontend der Anwendung als auch im Speicher ein zonaler Ausfall auftritt, bleibt das regionale Lite-Thema verfügbar, solange nicht beide Komponenten gleichzeitig ausfallen.

  • Wenn sowohl das Frontend der Anwendung als auch der Speicher gleichzeitig ausfallen, bleibt das regionale Lite-Thema während des Ausfalls nicht verfügbar. Während dieser Zeit können Clients möglicherweise keine Nachrichten veröffentlichen oder verarbeiten. Die Nachrichten werden jedoch weiterhin in der richtigen Reihenfolge zugestellt.

Ein regionales Lite-Thema bietet Schutz vor den meisten Arten von Fehlern in einer einzelnen Zone. In einigen seltenen Fällen kann der asynchrone Charakter der Replikation jedoch zu einem gleichzeitigen Ausfall mehrerer Komponenten in einer einzelnen Zone führen. Dadurch ist ein regionales Lite-Thema nicht mehr verfügbar.

Eigenschaften eines Lite-Themas

Lite-Themen haben die folgenden Eigenschaften:

  • Anzahl der Partitionen. Eine Partition ist die Basiseinheit der Parallelität in Pub/Sub Lite. Ein Lite-Thema kann eine oder mehrere Partitionen haben.

  • Kapazität einer Partition. Die Kapazität einer Partition wird durch die folgenden drei Attribute beschrieben:

    • Durchsatz für Veröffentlichungen (MiBps) Die maximale Rate, mit der Sie Nachrichten veröffentlichen können.

    • Abodurchsatz (MiBps): Die maximale Rate, mit der Nachrichten an Lite-Abos weitergeleitet werden.

    • Speicher (GiB). Die maximale Größe der Nachrichten in der Partition. Die konfigurierbare Mindestkapazität einer Partition beträgt 30 GiB.

  • Speicherkapazität eines Lite-Themas. Alle Partitionen in einem Lite-Thema haben dieselbe konfigurierte Speicherkapazität. Die Gesamtspeicherkapazität eines Lite-Themas ist die Summe der Speicherkapazität aller Partitionen im Thema. Wenn ein Lite-Thema beispielsweise 8 Partitionen hat und jede Partition eine Größe von 30 GiB hat, beträgt die Gesamtspeicherkapazität des Lite-Themas 240 GiB (8 × 30).

  • Durchsatzkapazität eines Lite-Themas. Die Durchsatzkapazität besteht aus der gesamten Durchsatzkapazität beim Veröffentlichen und Abonnieren aller Partitionen im Lite-Thema. Selbst wenn Sie ein Thema haben, das insgesamt einen Veröffentlichungsdurchsatz von 1 GiB/s unterstützen kann, ist es das Veröffentlichungslimit pro Partition, das den Durchsatz effektiv begrenzt.

  • Begrenzt auf Abonnentenclient und Abos. Pub/Sub Lite unterstützt einen einzelnen Abonnentenclient für eine einzelne Partition und ein einzelnes Abo. Beispiel: Ein Abo für ein Thema mit 5 Partitionen kann höchstens 5 Abonnentenclients haben, die Nachrichten daraus verarbeiten. Wenn mehr Abonnentenclients konfiguriert sind, bleiben die überzähligen Clients inaktiv. Ein Thema mit zwei Abos kann bis zu 10 Abonnentenclients haben, 5 Clients pro Abo.

  • Reservierungen: Eine Reservierung ist die einfachste Möglichkeit, Durchsatzkapazität für eine Reihe von Themen bereitzustellen und zu verwalten. Die Bereitstellung von Durchsatzkapazität mit Reservierungen ist für regionales Lite erforderlich und für zonale Lite-Themen optional.

    Wenn Sie keine Reservierungen für ein zonales Lite-Thema verwenden, müssen Sie die Durchsatzkapazität beim Veröffentlichen und Abonnieren des Themas explizit bereitstellen. Ohne Reservierung haben alle Partitionen in einem Lite-Thema dieselbe konfigurierte Durchsatzkapazität. Weitere Informationen finden Sie unter Durchsatzkapazität ohne Reservierungen konfigurieren.

  • Speicherkonfiguration: Zum Konfigurieren des Speichers müssen Sie sowohl die Speicherkapazität als auch optional die Aufbewahrungsdauer für Nachrichten angeben.

    • Aufbewahrungsdauer für Nachrichten. Der maximale Zeitraum, in dem Nachrichten in einem Lite-Thema gespeichert werden. Wenn Sie keine Aufbewahrungsdauer für Nachrichten angeben, speichert das Lite-Thema Nachrichten, bis Sie die Speicherkapazität überschreiten.

    • Speicherkapazität: Die Kapazität des Pub/Sub Lite-Themas wird durch die Anzahl der Partitionen im Thema und die Speicherkapazität jeder Partition bestimmt. Der Speicher pro Partition ist der Speicherplatz in Byte für jede Partition. Beachten Sie, dass regionale Lite-Themen für jedes veröffentlichte Byte 2 Byte an Speicherkapazität benötigen. Zonale Lite-Themen verwenden ein Byte Speicherkapazität für jedes veröffentlichte Byte.

    Wenn Sie die Speicherkapazität überschreiten, veröffentlicht der Pub/Sub Lite-Dienst weiterhin Nachrichten. Um jedoch mehr Speicherkapazität zu schaffen, werden die ältesten Nachrichten der Partition gelöscht. Die ältesten Nachrichten werden auch dann gelöscht, wenn die Nachrichtenaufbewahrungsdauer noch nicht abgelaufen ist. Der Dienst löscht niemals Nachrichten vor Ablauf der TTL, es sei denn, dies ist erforderlich, um Platz für neu veröffentlichte Nachrichten zu schaffen. Informationen zum Verhältnis der Kapazität zu den Preisen finden Sie unter Pub/Sub Lite-Preise.

Richtlinien zum Benennen eines Themas

Ein Pub/Sub Lite-Ressourcenname kennzeichnet eine Pub/Sub Lite-Ressource eindeutig, z. B. ein Thema, ein Abo oder eine Reservierung. Der Ressourcenname muss das folgende Format haben:

projects/project-identifier/collection/ID

  • project-identifier: Muss die Projekt-ID oder Projektnummer aus der Google Cloud Console sein. Beispiel: my-cool-project ist eine Projekt-ID. 123456789123 ist eine Projektnummer.

  • collection: Muss topics, subscriptions oder reservations sein.

  • ID: Muss den folgenden Richtlinien entsprechen:

    • Sie dürfen nicht mit dem String goog beginnen.
    • Muss mit einem Buchstaben beginnen
    • Er muss zwischen 3 und 255 Zeichen lang sein
    • Sie dürfen nur die folgenden Zeichen enthalten: Buchstaben [A-Za-z], Ziffern [0-9], Bindestriche -, Unterstriche _, Punkte ., Tilden ~, Pluszeichen + und Prozentzeichen %

    Sie können die Sonderzeichen aus der vorherigen Liste in Ressourcennamen ohne URL-Codierung verwenden. Alle anderen Sonderzeichen müssen richtig codiert oder decodiert werden, wenn Sie sie in URLs verwenden. mi-tópico ist beispielsweise keine gültige ID. mi-t%C3%B3pico ist jedoch gültig. Dieses Format ist wichtig, wenn Sie REST-Aufrufe ausführen.

Durchsatzkapazität eines Lite-Themas erhöhen

Wenn Sie keine Lite-Reservierungen verwenden, können Sie für die Durchsatzkapazität jeder Partition eines zonalen Lite-Themas einen Wert festlegen, der durch die folgenden Limits festgelegt wird:

  • Durchsatz für Veröffentlichungen zwischen 4 und 16 MiB/s

  • Abodurchsatz zwischen 4 und 32 MiB/s

Diese Limits gelten auch für Partitionen, die mit einer Lite-Reservierung verknüpft sind. Bei Reservierungen kann jede Partition eine beliebige Durchsatzkapazität innerhalb der angegebenen Limits nutzen, solange die Gesamtkapazität der Reservierung nicht überschritten wird. Optional können Sie ein unteres Limit für den tatsächlichen Durchsatz pro Partition festlegen, um den Traffic vorhersehbarer zu machen.

Sie können die Anzahl der Partitionen in einem Thema erhöhen, um es horizontal zu skalieren. Die Anzahl der Partitionen in einem Thema kann nicht verringert werden.

Wenn Sie die Anzahl der Partitionen ändern, wird die relative Reihenfolge der Nachrichten nicht beibehalten. Intern werden Nachrichten Partitionen über eine Hash-Funktion zugewiesen. Wenn Sie die Anzahl der Partitionen in einem Thema aktualisieren, ändert sich diese Hash-Funktion. Nachrichten mit demselben Schlüssel, die nach der Aktualisierung der Partitionsanzahl veröffentlicht wurden, werden wahrscheinlich einer anderen Partition zugeordnet als den, die vor dem Update veröffentlicht wurden.

Außerdem dauert es einige Sekunden, bis die Größenanpassung des Themas an alle Publisher weitergegeben wird. Es gibt kurze Zeit, in der einige Verlage und Webpublisher die neue Hash-Funktion nutzen, während andere noch die alte verwenden.

Speicherkapazität eines Lite-Themas erhöhen

Sie können den Speicherplatz für ein Lite-Thema erhöhen oder verringern. Das Lite-Thema stellt für jede Partition denselben Speicherplatz bereit. Wenn Sie den Speicher auf 60 GiB erhöhen, erhält jede Partition 60 GiB.

Wenn Sie den Speicherplatz in einem Lite-Thema verringern, entfernt der Pub/Sub Lite-Dienst zuerst die ältesten Nachrichten.

Informationen dazu, wie die Kapazität mit den Preisen zusammenhängt, finden Sie unter Pub/Sub Lite-Preise.

Lite-Thema erstellen

Sie können Lite-Themen mit der Google Cloud Console, der Google Cloud CLI oder der Pub/Sub Lite API erstellen.

Eine Liste der verfügbaren Regionen und Zonen finden Sie unter Pub/Sub Lite-Standorte.

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

  2. Klicken Sie auf Lite-Thema erstellen.

    1. Wählen Sie zum Erstellen eines zonalen Lite-Themas eine Region und eine Zone innerhalb der Region aus.

    2. Wählen Sie eine Region aus, um ein regionales Lite-Thema zu erstellen.

    Sie können den Standort nicht mehr aktualisieren, nachdem ein Thema erstellt wurde.

  3. Geben Sie im Abschnitt Name eine Lite-Themen-ID ein.

    Der Name des Lite-Themas enthält die Lite-Themen-ID, den Standort und die Projektnummer.

  4. Im Abschnitt Durchsatz:

    1. Wählen Sie eine Reservierung aus oder erstellen Sie eine.

      Dies ist für ein zonales Lite-Thema optional und für ein regionales Lite-Thema erforderlich.

    2. Geben Sie den Spitzendurchsatz für Veröffentlichungen und den Spitzendurchsatz für Abos ein.

      Je nach Ihren Eingaben wird eine Reihe von Partitionen automatisch festgelegt. Sie können diese Nummer bearbeiten, nachdem Sie das Thema gespeichert haben.

  5. Im Bereich Nachrichtenspeicher:

    1. Geben Sie den Speicher pro Partition ein.

    2. Wählen Sie eine der beiden Optionen für die Aufbewahrungsdauer für Nachrichten aus.

  6. Prüfen Sie die Änderungen und klicken Sie auf Erstellen.

gcloud

Verwenden Sie zum Erstellen eines Lite-Themas den Befehl 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]

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

  • LOCATION: der Name eines von Pub/Sub Lite unterstützten Standorts

  • NUMBER_OF_PARTITIONS: eine Ganzzahl für die Anzahl der Partitionen im Lite-Thema

  • STORAGE_PER_PARTITION: die Speichermenge für jede Partition, z. B. 30GiB

  • RESERVATION_NAME: der voll qualifizierte Pfad einer Lite-Reservierung wie projects/123456789/locations/us-west1/reservations/my-reservation

  • MESSAGE_RETENTION_PERIOD: die Zeit, die das Lite-Thema Nachrichten speichert, z. B. 1d oder 2w

Wenn die Anfrage erfolgreich ist, wird in der Befehlszeile eine Bestätigung angezeigt:

Created [TOPIC_ID].

Protokoll

Senden Sie zum Erstellen eines Lite-Themas eine POST-Anfrage wie die folgende:

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

Ersetzen Sie Folgendes:

Geben Sie im Anfragetext die folgenden Felder an:

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

Ersetzen Sie Folgendes:

  • NUMBER_OF_PARTITIONS: eine Ganzzahl für die Anzahl der Partitionen im Lite-Thema

  • STORAGE_PER_PARTITION: die Speichermenge für jede Partition, z. B. 30GiB

  • publish_CAPACITY: eine Ganzzahl für die Durchsatzkapazität beim Veröffentlichen jeder Partition

  • subscribe_CAPACITY: eine Ganzzahl für die Durchsatzkapazität jeder Partition für Abos

  • MESSAGE_RETENTION_PERIOD: die Zeit, die das Lite-Thema Nachrichten speichert, z. B. 1d oder 2w

  • RESERVATION_NAME: der voll qualifizierte Pfad einer Lite-Reservierung wie projects/123456789/locations/us-west1/reservations/my-reservation

Wenn die Anfrage erfolgreich ist, ist die Antwort das Lite-Thema im JSON-Format:

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

Einfach loslegen (Go)

Folgen Sie der Einrichtungsanleitung für Go in Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Java unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Python unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Nachdem Sie das Lite-Thema erstellt haben, können Sie den Durchsatz und die Speicherkapazität pro Partition skalieren. Sie können die Anzahl der Partitionen auch erhöhen, aber nicht verringern.

Lite-Thema aktualisieren

Sie können die folgenden Attribute eines Lite-Themas aktualisieren:

  • Die mit dem Lite-Thema verknüpfte Reservierung

  • Die Anzahl der Partitionen im Thema (kann nur erhöht werden)

  • Durchsatzkapazität beim Veröffentlichen und Abonnieren

  • Der Speicher pro Partition

  • Die Art der Nachrichtenaufbewahrung

Bevor Sie die Durchsatzkapazität oder die Speicherkapazität eines Themas skalieren, lesen Sie die Informationen unter Durchsatzkapazität skalieren und Speicherkapazität skalieren.

Sie können ein Lite-Thema mit der Google Cloud Console, der Google Cloud CLI oder der Pub/Sub Lite API aktualisieren.

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

  2. Klicken Sie auf die Lite-Themen-ID.

  3. Klicken Sie auf Bearbeiten.

  4. Sie können folgende Aktualisierungen vornehmen:

    • Verwenden Sie eine andere Reservierung. Für zonale Themen können Sie festlegen, dass keine Reservierung verwendet wird.
    • Geben Sie die Anzahl der Partitionen ein. Dieser Wert kann erhöht, aber nicht gesenkt werden.
    • Maximal zulässigen Durchsatz für Veröffentlichungen und Abos aktivieren oder deaktivieren.
    • Aktualisieren Sie bei zonalen Themen den Durchsatz für reservierte Veröffentlichungen und Abos. Bei Themen mit einer angehängten Reservierung entspricht der aktualisierte Durchsatz dem neuen Höchstlimit.
    • Bearbeiten Sie die Speicherkapazität pro Partition.
    • Aufbewahrungsdauer für Nachrichten bearbeiten
  5. Klicken Sie auf Aktualisieren.

gcloud

Verwenden Sie den Befehl gcloud pubsub lite-topics update, um ein Lite-Thema zu aktualisieren:

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

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

  • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

  • NUMBER_OF_PARTITIONS: die Anzahl der Partitionen, die für das Lite-Thema konfiguriert werden sollen

  • publish_CAPACITY: eine Ganzzahl für die Durchsatzkapazität beim Veröffentlichen jeder Partition

  • subscribe_CAPACITY: eine Ganzzahl für die Durchsatzkapazität jeder Partition für Abos

  • STORAGE_PER_PARTITION: die Speichermenge für jede Partition, z. B. 30GiB

  • MESSAGE_RETENTION_PERIOD: die Zeit, die das Lite-Thema Nachrichten speichert, z. B. 1d oder 2w

Wenn die Anfrage erfolgreich ist, wird in der Befehlszeile das Lite-Thema angezeigt:

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

Protokoll

Senden Sie zum Aktualisieren eines Lite-Themas eine PATCH-Anfrage wie die folgende:

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)

Ersetzen Sie Folgendes:

  • REGION: Region, in der sich das Lite-Thema befindet

  • PROJECT_NUMBER: die Projektnummer des Projekts mit dem Lite-Thema

  • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

  • TOPIC_ID: die ID des Lite-Themas

Geben Sie im Anfragetext die folgenden Felder an:

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

Ersetzen Sie Folgendes:

  • publish_CAPACITY: eine Ganzzahl für die Durchsatzkapazität beim Veröffentlichen jeder Partition

  • subscribe_CAPACITY: eine Ganzzahl für die Durchsatzkapazität jeder Partition für Abos

  • STORAGE_PER_PARTITION: die Speichermenge für jede Partition, z. B. 30GiB

  • MESSAGE_RETENTION_PERIOD: die Zeit, die das Lite-Thema Nachrichten speichert, z. B. 1d oder 2w

  • NUMBER_OF_PARTITIONS: die Anzahl der Partitionen, die für das Lite-Thema konfiguriert werden sollen

Wenn die Anfrage erfolgreich ist, ist die Antwort das Lite-Thema im JSON-Format:

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

Einfach loslegen (Go)

Folgen Sie der Einrichtungsanleitung für Go in Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Java unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Python unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Details zum Lite-Thema ansehen

Details zu einem Lite-Thema können Sie mit der Google Cloud Console, der Google Cloud CLI oder der Pub/Sub Lite API abrufen.

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

  2. Klicken Sie auf die Lite-Themen-ID.

gcloud

Mit dem Befehl gcloud pubsub lite-topics describe können Sie Details zu einem Lite-Thema abrufen:

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

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

  • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

Wenn die Anfrage erfolgreich ist, wird in der Befehlszeile das Lite-Thema angezeigt:

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

Protokoll

Wenn Sie Details zu einem Lite-Thema abrufen möchten, senden Sie eine GET-Anfrage wie die folgende:

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

Ersetzen Sie Folgendes:

  • REGION: Region, in der sich das Lite-Thema befindet

  • PROJECT_NUMBER: die Projektnummer des Projekts mit dem Lite-Thema

  • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

  • TOPIC_ID: die ID des Lite-Themas

Wenn die Anfrage erfolgreich ist, ist die Antwort das Lite-Thema im JSON-Format:

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

Einfach loslegen (Go)

Folgen Sie der Einrichtungsanleitung für Go in Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Java unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Python unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

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

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

topic_path = TopicPath(project_number, location, topic_id)

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

Lite-Themen auflisten

Sie können Lite-Themen in einem Projekt mit der Google Cloud Console, der Google Cloud CLI oder der Pub/Sub Lite API auflisten.

Console

  • Eine Liste der Lite-Themen in einem Projekt finden Sie auf der Seite Lite-Themen.

    Lite-Themen aufrufen

gcloud

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

Ersetzen Sie LOCATION durch den Namen des Standorts, an dem sich das Lite-Thema befindet.

Wenn die Anfrage erfolgreich ist, werden in der Befehlszeile die Lite-Themen angezeigt:

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

Protokoll

Um die Lite-Themen in einem Projekt aufzulisten, senden Sie eine GET-Anfrage wie die folgende:

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

Ersetzen Sie Folgendes:

  • REGION: Region, in der sich das Lite-Thema befindet

  • PROJECT_NUMBER: die Projektnummer des Projekts mit dem Lite-Thema

Wenn die Anfrage erfolgreich ist, ist die Antwort eine Liste von Lite-Themen im JSON-Format:

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

Einfach loslegen (Go)

Folgen Sie der Einrichtungsanleitung für Go in Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Java unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Python unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

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

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

location_path = LocationPath(project_number, location)

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

for topic in response:
    print(topic)

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

Lite-Thema löschen

Sie können Lite-Themen mit der Google Cloud Console, der Google Cloud CLI oder der Pub/Sub Lite API löschen.

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

  2. Klicken Sie auf die Lite-Themen-ID.

  3. Klicken Sie auf der Seite Lite-Themendetails auf Löschen.

  4. Geben Sie im angezeigten Feld delete ein, um zu bestätigen, dass Sie das Lite-Thema löschen möchten.

  5. Klicken Sie auf Löschen.

gcloud

Verwenden Sie den Befehl gcloud pubsub lite-topics delete, um ein Lite-Thema zu löschen:

  1. Führen Sie den Befehl delete aus:

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

    Ersetzen Sie Folgendes:

    • TOPIC_ID: die ID des Lite-Themas

    • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

  2. Zum Bestätigen geben Sie "Y" ein.

Wenn die Anfrage erfolgreich ist, lautet die Antwort folgendermaßen:

Deleted topic [TOPIC_ID].

Protokoll

Um ein Lite-Thema zu löschen, senden Sie eine DELETE-Anfrage wie die folgende:

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

Ersetzen Sie Folgendes:

  • REGION: Region, in der sich das Lite-Thema befindet

  • PROJECT_NUMBER: die Projektnummer des Projekts mit dem Lite-Thema

  • LOCATION: der Name des Standorts, an dem sich das Lite-Thema befindet

  • TOPIC_ID: die ID des Lite-Themas

Wenn die Anfrage erfolgreich ist, ist die Antwort ein leeres JSON-Objekt.

Einfach loslegen (Go)

Folgen Sie der Einrichtungsanleitung für Go in Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Java unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Folgen Sie der Einrichtungsanleitung für Python unter Pub/Sub Lite-Clientbibliotheken, bevor Sie dieses Beispiel ausführen.

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

Wenn Sie ein Lite-Thema löschen, können Sie darin keine Nachrichten veröffentlichen. Die Lite-Abos für das Lite-Thema sind noch vorhanden, aber Sie können keine Nachrichten von den Lite-Abos empfangen.

Weitere Informationen