Lite-Themen erstellen und verwalten

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

Übersicht über ein Lite-Thema

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

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

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.

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

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

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

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

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

  • Wenn sowohl das Frontend der Anwendung als auch der Speicher gleichzeitig ausfallen, bleibt das regionale Lite-Thema für die Dauer des Ausfalls nicht verfügbar. Während dieser Zeit kann es vorkommen, dass Clients keine Nachrichten veröffentlichen oder verarbeiten können, die Nachrichten aber trotzdem in der richtigen Reihenfolge zugestellt werden.

Ein regionales Lite-Thema bietet Schutz vor den meisten Arten von Ausfällen einzelner Zonen. In seltenen Fällen kann die asynchrone Replikation jedoch zu einem gleichzeitigen Ausfall mehrerer Komponenten in einer einzelnen Zone führen. Daher 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.

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

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

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

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

  • Speicherkapazität eines Lite-Themas: Alle Partitionen in einem Lite-Thema haben die gleiche konfigurierte Speicherkapazität. Die Gesamtspeicherkapazität eines Lite-Themas entspricht der Summe der Speicherkapazität aller Partitionen in dem 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 x 30).

  • Durchsatzkapazität eines Lite-Themas: Die Durchsatzkapazität umfasst die gesamte Durchsatzkapazität beim Veröffentlichen und Abonnieren aller Partitionen im Lite-Thema. Selbst wenn Sie ein Thema haben, das insgesamt 1 GiB/S an Veröffentlichungsdurchsatz unterstützen kann, ist es das Veröffentlichungslimit pro Partition, das den Durchsatz effektiv begrenzt.

  • Limit für 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 höchstens 5 Abonnentenclients haben, die Nachrichten aus diesem Thema abrufen. Wenn mehr Abonnentenclients konfiguriert sind, bleiben die überzähligen Clients inaktiv. Ein Thema mit zwei Abos kann bis zu 10 Abonnentenclients und 5 Clients pro Abo haben.

  • Reservierungen: Eine Reservierung ist die einfachste Möglichkeit, Durchsatzkapazität für eine Reihe von Themen bereitzustellen und zu verwalten. Die Bereitstellung von Durchsatzkapazität mit Reservierungen ist für regionale Lite-Ressourcen 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 explizit bereitstellen. Ohne Reservierung haben alle Partitionen in einem Lite-Thema die gleiche konfigurierte Durchsatzkapazität. Weitere Informationen finden Sie unter Durchsatzkapazität ohne Reservierungen konfigurieren.

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

    • Aufbewahrungsdauer für Nachrichten. Der maximale Zeitraum, für den ein Lite-Thema Nachrichten speichert. Wenn Sie keine Aufbewahrungsdauer für Nachrichten angeben, werden Nachrichten vom Lite-Thema gespeichert, bis die Speicherkapazität überschritten wird.

    • Speicherkapazität: Die Kapazität eines 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. Regionale Lite-Themen verwenden für jedes veröffentlichte Byte zwei Byte an Speicherkapazität. Zonale Lite-Themen verwenden für jedes veröffentlichte Byte ein Byte an Speicherkapazität.

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

Richtlinien zur Benennung eines Themas

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

projects/project-identifier/collection/ID

  • project-identifier: Muss die Projekt-ID oder Projektnummer 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: 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. Alle anderen Sonderzeichen müssen jedoch bei ihrer Verwendung in URLs richtig codiert oder decodiert werden. Beispielsweise ist mi-tópico eine ungü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 jeder Partition eines zonalen Lite-Themas auf einen Wert festlegen, 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 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 Partitionen mithilfe einer Hash-Funktion 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 Partitionsanzahl veröffentlicht wurde, werden wahrscheinlich einer anderen Partition zugeordnet als den vor der Aktualisierung veröffentlichten Nachrichten.

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

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 der Pub/Sub Lite API erstellen.

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

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

  2. Klicken Sie auf Lite-Thema erstellen.

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

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

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

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

    Der Name des Lite-Themas enthält die 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.

      Basierend auf Ihren Eingaben werden automatisch eine Reihe von Partitionen festgelegt. Sie können diese Zahl 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]

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

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

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

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

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

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

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

Created [TOPIC_ID].

Protokoll

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

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

Ersetzen Sie Folgendes:

Geben Sie im Anfragetext die folgenden Felder an:

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

Ersetzen Sie Folgendes:

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

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

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

  • subscribe_CAPACITY: Eine Ganzzahl für die Durchsatzkapazität beim Abonnieren 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 wie projects/123456789/locations/us-west1/reservations/my-reservation

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

{
  "name": projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID,
  "partitionConfig": {
       "count": NUMBER_OF_PARTITIONS,
       "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
       }
  },
  "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
  },
  "reservationConfig": {
       "throughputReservation": RESERVATION_NAME
  }
}

Einfach loslegen (Go)

Bevor Sie dieses Beispiel ausführen, folgen Sie der Einrichtungsanleitung für Go unter 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 der Anleitung zur Einrichtung von Java unter 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 der Anleitung zur Einrichtung von Python unter 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 und die Speicherkapazität pro Partition skalieren. Sie können die Anzahl der Partitionen auch erhöhen, aber nicht verringern.

Lite-Thema aktualisieren

Sie können die folgenden 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 Durchsatzkapazität oder die Speicherkapazität eines Themas skalieren, lesen Sie die Informationen unter Durchsatzkapazität skalieren und Speicherkapazität skalieren.

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

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

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

  3. Klicken Sie auf Bearbeiten.

  4. Sie können 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

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

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

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

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

  • subscribe_CAPACITY: Eine Ganzzahl für die Durchsatzkapazität beim Abonnieren 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)

Ersetzen Sie Folgendes:

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

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

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

  • TOPIC_ID: die ID des Lite-Themas

Geben Sie im Anfragetext die folgenden Felder an:

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

Ersetzen Sie Folgendes:

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

  • subscribe_CAPACITY: Eine Ganzzahl für die Durchsatzkapazität beim Abonnieren 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,
   },
}

Einfach loslegen (Go)

Bevor Sie dieses Beispiel ausführen, folgen Sie der Einrichtungsanleitung für Go unter 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 der Anleitung zur Einrichtung von Java unter 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 der Anleitung zur Einrichtung von Python unter 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

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

Console

  1. Rufen Sie die Seite Lite-Themen auf.

    Lite-Themen aufrufen

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

gcloud

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

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

Ersetzen Sie Folgendes:

  • TOPIC_ID: die ID des Lite-Themas

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

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

name: projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID
partitionConfig:
  count: NUMBER_OF_PARTITIONS
  capacity:
    publishMibPerSec: publish_CAPACITY
    subscribeMibPerSec: subscribe_CAPACITY
retentionConfig:
  perPartitionBytes: STORAGE_PER_PARTITION
  period: MESSAGE_RETENTION_PERIOD

Protokoll

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

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

Ersetzen Sie Folgendes:

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

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

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

  • TOPIC_ID: die ID des Lite-Themas

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

{
  "name": projects/PROJECT_NUMBER/locations/LOCATION/topics/TOPIC_ID,
  "partitionConfig": {
      "count": NUMBER_OF_PARTITIONS,
      "capacity": {
         "publishMibPerSec": publish_CAPACITY,
         "subscribeMibPerSec": subscribe_CAPACITY,
      }
   },
   "retentionConfig": {
       "perPartitionBytes": STORAGE_PER_PARTITION,
       "period": MESSAGE_RETENTION_PERIOD,
   },
}

Einfach loslegen (Go)

Bevor Sie dieses Beispiel ausführen, folgen Sie der Einrichtungsanleitung für Go unter 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 der Anleitung zur Einrichtung von Java unter 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 der Anleitung zur Einrichtung von Python unter 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

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

Ersetzen Sie Folgendes:

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

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

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

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

Einfach loslegen (Go)

Bevor Sie dieses Beispiel ausführen, folgen Sie der Einrichtungsanleitung für Go unter 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 der Anleitung zur Einrichtung von Java unter 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 der Anleitung zur Einrichtung von Python unter 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
    

    Ersetzen Sie Folgendes:

    • TOPIC_ID: die ID des Lite-Themas

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

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

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

Deleted topic [TOPIC_ID].

Protokoll

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

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

Ersetzen Sie Folgendes:

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

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

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

  • TOPIC_ID: die ID des Lite-Themas

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

Einfach loslegen (Go)

Bevor Sie dieses Beispiel ausführen, folgen Sie der Einrichtungsanleitung für Go unter 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 der Anleitung zur Einrichtung von Java unter 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 der Anleitung zur Einrichtung von Python unter 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