Lite-Themen erstellen und verwalten

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

Lite-Thema – Übersicht

Für einen Pub/Sub Lite-Dienst ist ein Thema erforderlich, an das Publisher 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.

Zonale Lite- und regionale Lite-Themen unterscheiden sich nur in der Art und Weise, wie Daten repliziert werden. Alle anderen Themeneigenschaften entsprechen denen, die in einem späteren Abschnitt dieses Dokuments beschrieben werden.

Datenreplikation in einem Lite-Thema

Bei regionalen Pub/Sub Lite-Themen werden Daten in zwei Zonen einer einzelnen Region gespeichert. Bei zonalen Pub/Sub Lite-Themen werden Daten nur innerhalb einer Zone repliziert. Pub/Sub Lite repliziert Daten asynchron.

Die Verfügbarkeit von Pub/Sub Lite hängt von der Verfügbarkeit der zugrunde liegenden Komponenten ab, einschließlich des Anwendungs-Frontends und des Speichers.

Die Verfügbarkeit eines zonalen Pub/Sub Lite-Themas hängt sowohl von der Verfügbarkeit des Anwendungs-Frontends als auch des Speichers in der konfigurierten Zone ab. Wenn das Anwendungs-Frontend oder der Speicher einen zonalen Fehler aufweist, 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-Frontends und des Speichers in der konfigurierten Region ab. Folgende Arten von Fehlern sind möglich:

  • Wenn das Anwendungs-Frontend oder der Speicher einen zonalen Fehler aufweist, bleibt das regionale Lite-Thema verfügbar.

  • Wenn sowohl das Anwendungs-Frontend als auch der Speicher einen Zonenausfall erleiden, bleibt das regionale Lite-Thema verfügbar, solange beide Komponenten nicht gleichzeitig ausfallen.

  • Wenn sowohl die Anwendungs-Frontend- als auch die Speicherkomponente gleichzeitig ausfallen, ist das regionale Lite-Thema für die Dauer des Ausfalls nicht verfügbar. In dieser Zeit können Clients keine Nachrichten veröffentlichen oder nutzen. Die Nachrichten werden aber trotzdem in der richtigen Reihenfolge zugestellt.

Ein regionales Lite-Thema bietet Schutz vor den meisten Arten von Ausfällen in einzelnen Zonen. In seltenen Fällen kann die asynchrone Replikation jedoch zu einem gleichzeitigen Ausfall mehrerer Komponenten in einer Zone führen. Infolgedessen 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 Parallelverarbeitung in Pub/Sub Lite. Ein Lite-Thema kann eine oder mehrere Partitionen haben.

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

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

    • Durchsatz beim Abonnieren (MiB/s) Die maximale Rate, mit der Nachrichten an Lite-Abos weitergeleitet werden.

    • Speicher (GiB) Die maximale Größe der Nachrichten in der Partition. Die 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 Gesamtdurchsatzkapazität beim Veröffentlichen und Abonnieren aller Partitionen im Lite-Thema. Selbst wenn ein Thema insgesamt einen Veröffentlichungsdurchsatz von 1 GiBps unterstützen kann, ist es das Veröffentlichungslimit pro Partition, das den Durchsatz effektiv begrenzt.

  • Begrenzung von Abonnentenclient und Abos Pub/Sub Lite unterstützt einen einzelnen Abonnentenclient für eine einzelne Partition und ein einzelnes Abo. Ein Abo für ein Thema mit 5 Partitionen kann beispielsweise maximal 5 Abonnentenclients haben, die Nachrichten daraus abrufen. Wenn mehr Abonnentenclients konfiguriert sind, bleiben die zusätzlichen Clients inaktiv. Das gleiche Thema mit zwei Abos kann bis zu zehn Abonnentenclients haben, also fünf Clients pro Abo.

  • Reservierungen Eine Reservierung ist die einfachste Möglichkeit, die Durchsatzkapazität für eine Reihe von Themen bereitzustellen und zu verwalten. Die Bereitstellung von Durchsatzkapazität mit Reservierungen ist für regionale Lite-Themen 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 für Veröffentlichungen und Abos 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 Um den Speicher zu konfigurieren, müssen Sie sowohl die Speicherkapazität als auch optional den Aufbewahrungszeitraum für Nachrichten angeben.

    • Aufbewahrungsdauer für Nachrichten Die maximale Zeit, für die ein Lite-Thema Nachrichten speichert. Wenn Sie keinen Aufbewahrungszeitraum 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. „Speicher pro Partition“ ist die Speichermenge in Byte für jede Partition. Bei regionalen Lite-Themen werden für jedes veröffentlichte Byte zwei Byte Speicherplatz benötigt. Bei zonalen Lite-Themen wird für jedes veröffentlichte Byte ein Byte Speicherplatz belegt.

    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 aus der Partition gelöscht. Die ältesten Nachrichten werden gelöscht, auch wenn die Nachrichten innerhalb der Aufbewahrungsdauer liegen. Der Dienst löscht Nachrichten nie vor Ablauf ihrer TTL, es sei denn, ihre Entfernung ist erforderlich, um Platz für neu veröffentlichte Nachrichten zu schaffen. Informationen dazu, wie die Kapazität mit den Preisen zusammenhängt, finden Sie unter Pub/Sub Lite-Preise.

Richtlinien für die Benennung von Themen

Ein Pub/Sub Lite-Ressourcenname identifiziert eine Pub/Sub Lite-Ressource wie ein Thema, Abo oder Reservierung eindeutig. Der Ressourcenname muss folgendermaßen formatiert sein:

projects/project-identifier/collection/ID

  • project-identifier: Muss die Projekt-ID oder Projektnummer sein, die in der Google Cloud Console verfügbar ist. my-cool-project ist beispielsweise eine Projekt-ID. 123456789123 ist eine Projektnummer.

  • collection: Muss topics, subscriptions oder reservations sein.

  • ID: Sie müssen den folgenden Richtlinien entsprechen:

    • Beginnen Sie nicht mit der Zeichenfolge goog.
    • Muss mit einem Buchstaben beginnen
    • Er muss zwischen 3 und 255 Zeichen lang sein
    • Er darf nur die folgenden Zeichen enthalten: Buchstaben [A-Za-z], Zahlen [0-9], Bindestriche -, Unterstriche _, Punkte ., Tilden ~, Pluszeichen + und Prozentzeichen %.

    Die Sonderzeichen in der obigen Liste können in Ressourcennamen ohne URL-Codierung verwendet werden. Sie müssen jedoch sicherstellen, dass alle anderen Sonderzeichen bei der Verwendung in URLs richtig codiert oder decodiert werden. Beispiel: mi-tópico ist eine ungü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 die Durchsatzkapazität jeder Partition eines zonalen Lite-Themas auf einen Wert festlegen, der durch die folgenden Limits bestimmt wird:

  • Veröffentlichungsdurchsatz zwischen 4 und 16 MiBps

  • Abodurchsatz zwischen 4 und 32 MiBps

Diese Limits gelten auch für Partitionen, die mit einer Lite-Reservierung verknüpft sind. Mit Reservierungen kann jede Partition die gesamte Durchsatzkapazität innerhalb der angegebenen Limits nutzen, solange die Gesamtkapazität der Reservierung nicht überschritten wird. Optional können Sie ein Unterlimit 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 mithilfe einer Hash-Funktion Partitionen zugewiesen. Wenn Sie die Anzahl der Partitionen in einem Thema aktualisieren, ändert sich diese Hash-Funktion. Nachrichten mit demselben Schlüssel, der nach der Aktualisierung der Partitionszahl veröffentlicht wurde, werden wahrscheinlich einer anderen Partition zugeordnet als Nachrichten, die vor der Aktualisierung veröffentlicht wurden.

Darüber hinaus dauert es einige Sekunden, bis die Größe des Themas an alle Publisher weitergegeben wurde. Es wird eine kurze Zeit geben, in der einige Publisher die neue Hash-Funktion und andere noch die alte Hash-Funktion verwenden.

Speicherkapazität eines Lite-Themas erhöhen

Sie können den Speicher in einem Lite-Thema erhöhen oder reduzieren. 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. Wenn Sie ein zonales Lite-Thema erstellen möchten, wählen Sie 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 ID, den Standort und die Projektnummer des Lite-Themas.

  4. Im Bereich 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.

      Anhand Ihrer Eingaben werden automatisch mehrere Partitionen festgelegt. Sie können diese Anzahl bearbeiten, nachdem Sie das Thema gespeichert haben.

  5. Gehen Sie im Abschnitt Nachrichtenspeicher so vor:

    1. Geben Sie den Speicherplatz pro Partition ein.

    2. Wählen Sie eine der beiden Optionen für die Aufbewahrungsdauer von 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]

Dabei gilt:

  • 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, z. B. 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)

Dabei gilt:

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

Dabei gilt:

  • 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 Veröffentlichungsdurchsatzkapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für die Abonnementdurchsatzkapazität jeder Partition

  • 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, z. B. 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
  }
}

Go

Bevor Sie dieses Beispiel ausführen, folgen Sie der Anleitung zur Einrichtung von Go in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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 pro Partition und die Speicherkapazität skalieren. Sie können auch die Anzahl der Partitionen erhöhen, aber nicht verringern.

Lite-Thema aktualisieren

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

  • Die mit dem Lite-Thema verknüpfte Reservierung

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

  • Die Durchsatzkapazitätslimits für das Veröffentlichen und Abonnieren

  • Speicherplatz pro Partition

  • Art der Nachrichtenspeicherung

Bevor Sie die Durchsatzkapazität oder die Speicherkapazität eines Topics skalieren, lesen Sie die Hilfeartikel 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 eine oder mehrere der folgenden Änderungen vornehmen:

    • Verwenden Sie eine andere Reservierung. Für zonale Themen können Sie auf eine Reservierung verzichten.
    • Geben Sie die Anzahl der Partitionen ein. Dieser Wert kann erhöht, aber nicht verringert werden.
    • Aktivieren oder deaktivieren Sie den maximal zulässigen Durchsatz für die Veröffentlichung und das Abonnieren.
    • Aktualisieren Sie für zonale Themen den reservierten Durchsatz für Veröffentlichungen und Abos. Bei Themen mit einer Reservierung entspricht der aktualisierte Durchsatz dem neuen Höchstwert.
    • Bearbeiten Sie die Speicherkapazität pro Partition.
    • Bearbeiten Sie die Aufbewahrungsdauer für Nachrichten.
  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

Dabei gilt:

  • 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 Veröffentlichungsdurchsatzkapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für die Abonnementdurchsatzkapazität jeder Partition

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

Dabei gilt:

  • 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 Veröffentlichungsdurchsatzkapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für die Abonnementdurchsatzkapazität jeder Partition

  • 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,
   },
}

Go

Bevor Sie dieses Beispiel ausführen, folgen Sie der Anleitung zur Einrichtung von Go in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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 zu Lite-Themen ansehen

Details zu einem Lite-Thema erhalten Sie über die Google Cloud Console, die Google Cloud CLI oder die Pub/Sub Lite API.

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

Dabei gilt:

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

Dabei gilt:

  • 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,
   },
}

Go

Bevor Sie dieses Beispiel ausführen, folgen Sie der Anleitung zur Einrichtung von Go in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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)

Dabei gilt:

  • 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",
      }
  ]
}

Go

Bevor Sie dieses Beispiel ausführen, folgen Sie der Anleitung zur Einrichtung von Go in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

    Dabei gilt:

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

Dabei gilt:

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

Go

Bevor Sie dieses Beispiel ausführen, folgen Sie der Anleitung zur Einrichtung von Go in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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

Bevor Sie dieses Beispiel ausführen, folgen Sie den Schritten zur Einrichtung von Java in Pub/Sub Lite-Clientbibliotheken.

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