Lite-Themen erstellen und verwalten

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

Übersicht über ein Lite-Thema

Für einen Pub/Sub Lite-Dienst ist ein Thema erforderlich, an das Publisher Nachrichten senden können Nachrichten senden, damit Abonnenten diese Nachrichten empfangen können. Innerhalb von Pub/Sub Lite auswählen, können Sie ein zonales oder regionales Lite-Element erstellen .

Ein zonales Lite-Thema und ein regionales Lite-Thema unterscheiden sich nur in der Art und Weise, wie sie repliziert werden Daten. Alle anderen Themeneigenschaften sind mit denen identisch, die in einem späteren Abschnitt von in diesem Dokument.

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 in nur einer Zone. Pub/Sub Lite repliziert Daten asynchron programmiert.

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

Die Verfügbarkeit eines zonalen Pub/Sub Lite-Themas hängt vom des Anwendungs-Front-Ends und des Speichers in der konfigurierten . Wenn im Frontend oder Speicher der Anwendung ein zonaler Fehler auftritt, Das zonale Lite-Thema ist für die Dauer des Ausfalls nicht verfügbar.

Die Verfügbarkeit eines regionalen Pub/Sub Lite-Themas hängt vom Verfügbarkeit des Front-Ends und des Speichers der Anwendung in der konfigurierten Region Folgende Fehlertypen sind möglich:

  • Wenn im Front-End oder des Speichers der Anwendung ein zonaler Fehler auftritt, ist das regionale Lite-Thema bleibt verfügbar.

  • Wenn sowohl im Front-End als auch im Speicher der Anwendung ein zonaler Fehler auftritt, Das regionale Lite-Thema bleibt verfügbar, solange nicht beide Komponenten gleichzeitig ausfallen .

  • Wenn das Front-End und der Speicher der Anwendung gleichzeitig ausfallen, gibt der Fehler Das regionale Lite-Thema ist für die Dauer des Ausfalls nicht verfügbar. Während dieser Zeit können Clients Nachrichten nicht veröffentlichen oder verarbeiten, aber Nachrichten bleiben in der richtigen Reihenfolge geliefert werden.

Ein regionales Lite-Thema bietet Schutz vor den meisten Arten einzelner Zonen Störungen. In seltenen Fällen kann die asynchrone Replikation jedoch auch mehrere Komponenten in einer Zone gleichzeitig ausfallen. Als führt, 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, Pub/Sub Lite Ein Lite-Thema kann eine oder mehrere Partitionen haben.

  • Kapazität einer Partition: Die Kapazität einer Partition wird durch den folgenden drei Eigenschaften:

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

    • Abodurchsatz (MiBps): Die maximale Rate , bei dem 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-Geräts topic ist die Summe der Speicherkapazität aller Partitionen im Thema. Für Beispiel: Ein Lite-Thema hat 8 Partitionen und jede Partition hat eine 30 GiB beträgt die Gesamtspeicherkapazität des Lite-Themas 240 GiB (8 x 30).

  • Durchsatzkapazität eines Lite-Themas: Die Durchsatzkapazität besteht aus den Gesamtdurchsatzkapazität beim Veröffentlichen und Abonnieren aller Partitionen im Lite-Thema Selbst wenn Sie ein Thema haben, 1 Gbit/s Veröffentlichungsdurchsatz beträgt das Veröffentlichungslimit pro Partition, den Durchsatz effektiv begrenzt.

  • Limit für Abonnentenclient und Abos: Pub/Sub Lite unterstützt einen einzelnen Abonnentenclient für eine einzelne Partition und eine einzelne Abo. Ein Abo für ein Thema mit 5 Partitionen kann beispielsweise Folgendes haben: höchstens 5 Abonnentenclients, die Nachrichten daraus abrufen. Wenn mehr Abonnent konfiguriert sind, bleiben die überschüssigen Clients inaktiv. Das gleiche Thema mit 2 Abos können bis zu 10 Abonnentenclients mit jeweils 5 Clients haben Abo.

  • Reservierungen: Eine Reservierung ist die einfachste Möglichkeit, Durchsatzkapazität für eine Reihe von Themen. Durchsatzkapazität bereitstellen mit Reservierungen ist für regionale Lite erforderlich und für zonale Liter optional Lite-Themen

    Wenn Sie keine Reservierungen für ein zonales Lite-Thema verwenden, müssen Sie Sie stellen die Durchsatzkapazität für Veröffentlichungen und Abos des Themas bereit. Ohne Reservierung haben alle Partitionen in einem Lite-Thema Durchsatzkapazität konfiguriert. Weitere Informationen finden Sie unter Durchsatzkapazität ohne Reservierungen konfigurieren.

  • Speicherkonfiguration: Zum Konfigurieren des Speichers müssen Sie sowohl das Attribut Speicherkapazität und optional die Aufbewahrungsdauer für Nachrichten.

    • Aufbewahrungsdauer für Nachrichten. Die maximale Zeitspanne, für die ein Lite-Gerät Thema speichert Nachrichten. Wenn Sie keine Aufbewahrungsdauer für Nachrichten festlegen, Im Lite-Thema werden Nachrichten gespeichert, bis die Speicherkapazität überschritten ist.

    • Speicherkapazität: Die Kapazität des Pub/Sub Lite-Themas wird durch die Anzahl der Partitionen im Thema und die Speicherkapazität bestimmt für jede Partition. „Speicherplatz pro Partition“ ist der Speicherplatz in Byte, für jede Partition. Beachten Sie, dass regionale Lite-Themen zwei Byte Speicherplatz nutzen Kapazität für jedes veröffentlichte Byte. Zonale Lite-Themen verwenden 1 Byte Speicherplatz Kapazität für jedes veröffentlichte Byte.

    Wenn Sie die Speicherkapazität überschreiten, weiterhin Nachrichten veröffentlicht. Um jedoch mehr Speicherplatz zur Verfügung zu stellen, werden die ältesten Nachrichten aus der Partition gelöscht. Das Löschen von Die ältesten Nachrichten erscheinen auch dann, wenn sich die Nachrichten in der Nachricht befinden. Aufbewahrungsdauer. Nachrichten werden vom Dienst nie vor Ablauf der TTL gelöscht verfällt, es sei denn, ihre Entfernung ist erforderlich, um Platz für neu veröffentlichte Nachrichten. Informationen zum Verhältnis der Kapazität zu den Preisen finden Sie unter Pub/Sub Lite-Preise.

Richtlinien zur Benennung eines Themas

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

projects/project-identifier/collection/ID

  • project-identifier: Muss die Projekt-ID oder Projektnummer sein, die im Google Cloud Console my-cool-project ist beispielsweise 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 in der vorherigen Liste in Ressourcennamen ohne URL-Codierung verwenden. Sie müssen jedoch darauf achten, dass alle anderen Sonderzeichen 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 durchführen.

Durchsatzkapazität eines Lite-Themas erhöhen

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

  • Veröffentlichungsdurchsatz 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. Mit Reservierungen kann jede Partition eine beliebige Durchsatzkapazität innerhalb die angegebenen Limits erreichen, solange die Gesamtkapazität die Reservierung wird nicht überschritten. Optional können Sie für die tatsächlicher Durchsatz pro Partition, 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, ist die relative Reihenfolge der Nachrichten nicht beibehalten werden. Intern werden Nachrichten Partitionen mithilfe eines Hashwerts zugewiesen . Wenn Sie die Anzahl der Partitionen in einem Thema aktualisieren, ändert sich dieser Hashwert . Nachrichten mit demselben Schlüssel, die nach der Aktualisierung der Partitionsanzahl veröffentlicht wurden wahrscheinlich einer anderen Partition als den vor der Veröffentlichung aktualisieren.

Außerdem dauert es einige Sekunden, bis die Größenanpassung des Themas für alle Nutzer die Verlage und Webpublisher. Einige Verlage und Webpublisher nutzen das neue und einige nutzen noch die alte Hash-Funktion.

Speicherkapazität eines Lite-Themas erhöhen

Sie können den Speicherplatz in einem 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 die Pub/Sub Lite API.

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

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 ID des Lite-Themas, den Ort und die Projektnummer.

  4. Im Bereich Durchsatz:

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

      Dies ist bei einem zonalen Lite-Thema optional und bei einem regionalen Lite-Thema erforderlich.

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

      Eine Reihe von Partitionen wird automatisch anhand Ihrer Eingaben festgelegt. Ich können diese Nummer bearbeiten, nachdem Sie das Thema gespeichert haben.

  5. Im Abschnitt Nachrichtenspeicher:

    1. Geben Sie den Speicherplatz pro Partition ein.

    2. Wählen Sie eine der beiden Optionen für die Nachrichtenaufbewahrungsdauer 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 eines Lite reservation wie 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 den Veröffentlichungsdurchsatz Kapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für den Abodurchsatz. Kapazitä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 eines Lite reservation wie 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 Speicherkapazität. Sie können die Anzahl der Anzeigen auch erhöhen, Partitionen.

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)

  • Durchsatzkapazitätslimits für Veröffentlichungen und Abos

  • Der Speicherplatz pro Partition

  • Die Art der Nachrichtenaufbewahrung

Bevor Sie die Durchsatz- oder Speicherkapazität eines Weitere Informationen finden Sie unter Durchsatzkapazität skalieren und Speicher skalieren Kapazität.

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

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 alle der folgenden Aktualisierungen vornehmen:

    • Verwenden Sie eine andere Reservierung. Bei zonalen Themen können Sie sich dafür entscheiden, keine Reservierung zu verwenden.
    • 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 Veröffentlichungen und Abos.
    • Aktualisieren Sie bei zonalen Themen den Durchsatz für reservierte Veröffentlichungen und Abos. Bei Themen mit angehängter Reservierung spiegelt der aktualisierte Durchsatz das neue Höchstlimit wider.
    • 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

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 den Veröffentlichungsdurchsatz Kapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für den Abodurchsatz. Kapazitä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 den Veröffentlichungsdurchsatz Kapazität jeder Partition

  • subscribe_CAPACITY: Eine Ganzzahl für den Abodurchsatz. Kapazitä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 zum Lite-Thema ansehen

Details zu einem Lite-Thema können Sie über die Google Cloud Console, die Google Cloud CLI oder 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 über die Google Cloud Console auflisten, die Google Cloud CLI oder Pub/Sub Lite API verwenden.

Console

  • Wenn Sie sich eine Liste der Lite-Themen in einem Projekt ansehen möchten, rufen Sie die Seite Lite-Themen auf.

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

  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