Crea y administra temas de Lite

En este documento, se explica cómo crear, ver y borrar un tema de Pub/Sub Lite.

Descripción general de un tema de Lite

Un servicio de Pub/Sub Lite requiere un tema al que los publicadores puedan enviar mensajes para que los suscriptores puedan recibirlos. En Pub/Sub Lite, puedes optar por crear un tema de Lite zonal o regional.

Un tema Lite zonal y uno regional de Lite solo difieren en la forma en que replican los datos. Todas las demás propiedades de los temas son las mismas que se describen en una sección posterior de este documento.

Replicación de datos en un tema de Lite

Los temas regionales de Pub/Sub Lite almacenan datos en dos zonas de una sola región. Los temas zonales de Pub/Sub Lite replican los datos dentro de una sola zona. Pub/Sub Lite replica los datos de forma asíncrona.

La disponibilidad de Pub/Sub Lite depende de sus componentes subyacentes, que incluyen el frontend y el almacenamiento de la aplicación.

La disponibilidad de un tema zonal de Pub/Sub Lite depende de la disponibilidad del frontend de la aplicación y del almacenamiento en la zona configurada. Si el frontend o el almacenamiento de la aplicación experimentan una falla zonal, el tema zonal Lite dejará de estar disponible mientras dure la interrupción.

La disponibilidad de un tema regional de Pub/Sub Lite depende de la disponibilidad del frontend y del almacenamiento de la aplicación en la región configurada. Los siguientes tipos de fallas son posibles:

  • Si el frontend de la aplicación o el almacenamiento experimenta una falla zonal, el tema regional de Lite seguirá disponible.

  • Si tanto el frontend como el almacenamiento de la aplicación experimentan una falla zonal, el tema regional de Lite permanecerá disponible siempre que ambos componentes no comiencen a fallar al mismo tiempo.

  • Si el frontend y el almacenamiento de la aplicación fallan simultáneamente, el tema regional de Lite no estará disponible mientras dure la interrupción. Durante este tiempo, es posible que los clientes no publiquen ni consuman mensajes, pero estos aún se entregan en el orden correcto.

Un tema regional Lite proporciona protección contra la mayoría de los tipos de fallas de una sola zona. Sin embargo, en algunos casos excepcionales, la naturaleza asíncrona de la replicación puede causar una falla simultánea de varios componentes en una sola zona. Como resultado, un tema regional Lite deja de estar disponible.

Propiedades de un tema de Lite

Los temas de Lite tienen las siguientes propiedades:

  • Cantidad de particiones. Una partición es la unidad básica de paralelismo en Pub/Sub Lite. Un tema Lite puede tener una o más particiones.

  • Capacidad de una partición. La capacidad de una partición se describe mediante las siguientes tres propiedades:

    • Capacidad de procesamiento de publicación (MiBps). La frecuencia máxima a la que puedes publicar mensajes.

    • Capacidad de procesamiento de suscripción (MiBps) La tasa máxima con la que se reenvían mensajes a las suscripciones Lite.

    • Almacenamiento (GiB): El tamaño máximo de los mensajes en la partición. La capacidad mínima configurable de una partición es de 30 GiB.

  • Capacidad de almacenamiento de un tema de Lite Todas las particiones de un tema de Lite tienen la misma capacidad de almacenamiento configurada. La capacidad de almacenamiento total de un tema Lite es la suma de la capacidad de almacenamiento de todas las particiones del tema. Por ejemplo, si un tema Lite tiene 8 particiones y cada una de ellas tiene un tamaño de 30 GiB, la capacidad de almacenamiento total del tema Lite será de 240 GiB (8 × 30).

  • Capacidad de procesamiento de un tema Lite La capacidad de procesamiento consiste en la capacidad total de procesamiento de publicación y suscripción de todas las particiones del tema Lite. Incluso si tienes un tema que, en conjunto, puede admitir 1 GiB de capacidad de procesamiento de publicación, es el límite de publicación por partición el que limita de manera efectiva la capacidad de procesamiento.

  • Límite de suscripciones y cliente suscriptor. Pub/Sub Lite admite un cliente suscriptor único para una partición única y una suscripción única. Por ejemplo, una suscripción a un tema con 5 particiones puede tener, como máximo, 5 clientes suscriptores que consuman mensajes de ese tema. Si se configuran más clientes suscriptores, los clientes excedentes permanecerán inactivos. El mismo tema con 2 suscripciones puede tener hasta 10 clientes suscriptores y 5 clientes por cada suscripción.

  • Reservas. Una reserva es la forma más fácil de aprovisionar y administrar la capacidad de procesamiento para varios temas. El aprovisionamiento de capacidad de procesamiento con reservas es obligatorio para los temas Lite regionales y opcional para los temas Lite zonales.

    Si no usas reservas para un tema zonal de Lite, debes aprovisionar de forma explícita la capacidad de procesamiento de publicación y suscripción del tema. Sin una reserva, todas las particiones de un tema de Lite tienen la misma capacidad de procesamiento configurada. Para obtener más información, consulta Configura la capacidad de procesamiento sin reservas.

  • Configuración de almacenamiento. Para configurar el almacenamiento, debes especificar la capacidad de almacenamiento y, de forma opcional, el período de retención de mensajes.

    • Período de retención de mensajes. El tiempo máximo durante el cual un tema de Lite almacena mensajes. Si no especificas un período de retención de mensajes, el tema Lite almacenará los mensajes hasta que superes la capacidad de almacenamiento.

    • Capacidad de almacenamiento. La capacidad del tema de Pub/Sub Lite está determinada por la cantidad de particiones del tema y la capacidad de almacenamiento de cada una. El almacenamiento por partición es la cantidad de almacenamiento, en bytes, para cada partición. Ten en cuenta que los temas regionales de Lite usan dos bytes de capacidad de almacenamiento por cada byte publicado. Los temas de Zonal Lite usan un byte de capacidad de almacenamiento por cada byte publicado.

    Si superas la capacidad de almacenamiento, el servicio de Pub/Sub Lite continúa publicando mensajes. Sin embargo, para crear más capacidad de almacenamiento, se borran los mensajes más antiguos de la partición. Los mensajes más antiguos se borran incluso si están dentro del período de retención de mensajes. El servicio nunca borra mensajes antes de que venza su TTL, a menos que la eliminación sea necesaria para dejar espacio para los mensajes recién publicados. Para obtener información sobre cómo se relaciona la capacidad con los precios, consulta Precios de Pub/Sub Lite.

Lineamientos para asignar nombres a un tema

Un nombre de recurso de Pub/Sub Lite identifica de forma única un recurso de Pub/Sub Lite, como un tema, una suscripción o una reserva. El nombre del recurso debe tener el siguiente formato:

projects/project-identifier/collection/ID

  • project-identifier: Debe ser el ID o número del proyecto, disponible en la consola de Google Cloud. Por ejemplo, my-cool-project es un ID del proyecto. 123456789123 es un número de proyecto.

  • collection: Debe ser topics, subscriptions o reservations.

  • ID: Debe cumplir con los siguientes lineamientos:

    • No debe comenzar con la cadena goog.
    • Comenzar con una letra
    • tener entre 3 y 255 caracteres
    • Contiene solo los siguientes caracteres: letras [A-Za-z], números [0-9], guiones -, guiones bajos _, puntos ., virgulillas ~, signos más + y signos de porcentaje %

    Puedes usar los caracteres especiales de la lista anterior en nombres de recursos sin codificación de URL. Sin embargo, debes asegurarte de que los demás caracteres especiales estén correctamente codificados o decodificados cuando los uses en las URLs. Por ejemplo, mi-tópico es un ID no válido. Sin embargo, mi-t%C3%B3pico es válido. Este formato es importante cuando realizas llamadas de REST.

Aumenta la capacidad de procesamiento de un tema de Lite

Si no usas reservas de Lite, puedes configurar la capacidad de procesamiento de cada partición de cualquier tema zonal de Lite en un valor establecido por los siguientes límites:

  • Capacidad de procesamiento de publicación de entre 4 y 16 MiBps

  • Capacidad de procesamiento de suscripción de entre 4 y 32 MiBps

Estos límites también se aplican a las particiones asociadas con una reserva de Lite. Con las reservas, cada partición puede consumir cualquier capacidad de procesamiento dentro de los límites especificados, siempre que no se supere la capacidad total de la reserva. De manera opcional, puedes establecer un límite más bajo en la capacidad de procesamiento real por partición para que el tráfico sea más predecible.

Puedes aumentar la cantidad de particiones de un tema para escalarlo de forma horizontal. No se puede disminuir la cantidad de particiones en un tema.

Cuando cambias la cantidad de particiones, el orden relativo de los mensajes no se conserva. De forma interna, los mensajes se asignan a las particiones mediante una función hash. La actualización de la cantidad de particiones en un tema cambia esta función de hash. Es probable que los mensajes con la misma clave publicadas después de la actualización del recuento de particiones se asignen a una partición diferente a la publicada antes de la actualización.

Además, el cambio de tamaño del tema tarda unos segundos en propagarse a todos los publicadores. Hay poco tiempo en que algunos publicadores usen la función hash nueva y otros sigan usando la anterior.

Aumenta la capacidad de almacenamiento de un tema de Lite

Puedes aumentar o disminuir la cantidad de almacenamiento en un tema de Lite. El tema de Lite aprovisiona la misma cantidad de almacenamiento para cada partición. Si aumentas el almacenamiento a 60 GiB, cada una de las particiones obtiene 60 GiB de almacenamiento.

Si disminuyes la cantidad de almacenamiento en un tema de Lite, el servicio de Pub/Sub Lite primero quitará los mensajes más antiguos.

Para obtener información sobre cómo se relaciona la capacidad con los precios, consulta Precios de Pub/Sub Lite.

Crea un tema de Lite

Puedes crear temas Lite con la consola de Google Cloud, Google Cloud CLI o la API Lite de Pub/Sub.

Para obtener una lista de las regiones y zonas disponibles, consulta las ubicaciones de Pub/Sub Lite.

Console

  1. Ve a la página Temas de Lite.

    Ir a los temas de Lite

  2. Haz clic en Crear tema de Lite.

    1. Para crear un tema zonal de Lite, selecciona una región y una zona dentro de la región.

    2. Selecciona una región para crear un tema regional Lite.

    No puedes actualizar la ubicación después de crear un tema.

  3. En la sección Nombre, ingresa un ID de tema de Lite.

    El nombre del tema de Lite incluye su ID, la ubicación y el número de proyecto.

  4. En la sección Capacidad de procesamiento, haz lo siguiente:

    1. Selecciona o crea una reserva.

      Es opcional para un tema zonal de Lite y obligatorio para un tema regional de Lite.

    2. Ingresa la capacidad de procesamiento de publicación máxima y la de suscripción máxima.

      Varias particiones se configuran automáticamente en función de tus entradas. Puedes editar esta cantidad después de guardar el tema.

  5. En la sección Almacenamiento de mensajes, haz lo siguiente:

    1. Ingresa el almacenamiento por partición.

    2. Selecciona una de las dos opciones para el período de retención de mensajes.

  6. Revisa los cambios y haz clic en Crear.

gcloud

Para crear un tema de Lite, usa el comando 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]

Reemplaza lo siguiente:

  • TOPIC_ID: el ID del tema de Lite

  • LOCATION: Es el nombre de una ubicación que admite Pub/Sub Lite.

  • NUMBER_OF_PARTITIONS: un número entero para la cantidad de particiones en el tema de Lite

  • STORAGE_PER_PARTITION: la cantidad de almacenamiento para cada partición, como 30GiB

  • RESERVATION_NAME: Es la ruta de acceso completamente calificada de una reserva Lite, como projects/123456789/locations/us-west1/reservations/my-reservation

  • MESSAGE_RETENTION_PERIOD: la cantidad de tiempo que el tema de Lite almacena mensajes, como 1d o 2w

Si la solicitud es exitosa, la línea de comandos muestra una confirmación:

Created [TOPIC_ID].

Protocolo

Para crear un tema de Lite, envía una solicitud POST como la siguiente:

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

Reemplaza lo siguiente:

Especifica los siguientes campos en el cuerpo de la solicitud:

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

Reemplaza lo siguiente:

  • NUMBER_OF_PARTITIONS: un número entero para la cantidad de particiones en el tema de Lite

  • STORAGE_PER_PARTITION: la cantidad de almacenamiento para cada partición, como 30GiB

  • publish_CAPACITY: Un número entero para la capacidad de procesamiento de publicación de cada partición

  • subscribe_CAPACITY: Es un número entero para la capacidad de procesamiento de suscripción de cada partición.

  • MESSAGE_RETENTION_PERIOD: la cantidad de tiempo que el tema de Lite almacena mensajes, como 1d o 2w

  • RESERVATION_NAME: Es la ruta de acceso completamente calificada de una reserva Lite, como projects/123456789/locations/us-west1/reservations/my-reservation

Si la solicitud se realiza correctamente, la respuesta es el tema de Lite en formato JSON:

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

Go

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Go en las bibliotecas cliente de Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func createTopic(w io.Writer, projectID, region, location, topicID, reservation string) error {
	// projectID := "my-project-id"
	// region := "us-central1" // see https://cloud.google.com/pubsub/lite/docs/locations
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	// reservation := "projects/my-project-id/reservations/my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	const gib = 1 << 30

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	// For ranges of fields in TopicConfig, see https://pkg.go.dev/cloud.google.com/go/pubsublite/#TopicConfig
	topic, err := client.CreateTopic(ctx, pubsublite.TopicConfig{
		Name:                       topicPath,
		PartitionCount:             2, // Must be >= 1 and cannot decrease after creation.
		PublishCapacityMiBPerSec:   4,
		SubscribeCapacityMiBPerSec: 8,
		PerPartitionBytes:          30 * gib,
		RetentionDuration:          pubsublite.InfiniteRetention,
		ThroughputReservation:      reservation,
	})
	if err != nil {
		return fmt.Errorf("client.CreateTopic got err: %w", err)
	}
	fmt.Fprintf(w, "Created topic: %#v\n", topic)
	return nil
}

Java

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Java en las bibliotecas cliente de Pub/Sub Lite.

import com.google.api.gax.rpc.AlreadyExistsException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig.Capacity;
import com.google.cloud.pubsublite.proto.Topic.ReservationConfig;
import com.google.cloud.pubsublite.proto.Topic.RetentionConfig;
import com.google.protobuf.util.Durations;
import java.util.concurrent.ExecutionException;

public class CreateTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'a';
    String topicId = "your-topic-id";
    String reservationId = "your-reservation-id";
    long projectNumber = Long.parseLong("123456789");
    int partitions = 1;
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = false;

    createTopicExample(
        cloudRegion, zoneId, projectNumber, topicId, reservationId, partitions, regional);
  }

  public static void createTopicExample(
      String cloudRegion,
      char zoneId,
      long projectNumber,
      String topicId,
      String reservationId,
      int partitions,
      boolean regional)
      throws Exception {

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    Topic topic =
        Topic.newBuilder()
            .setPartitionConfig(
                PartitionConfig.newBuilder()
                    // Set throughput capacity per partition in MiB/s.
                    .setCapacity(
                        Capacity.newBuilder()
                            // Must be 4-16 MiB/s.
                            .setPublishMibPerSec(4)
                            // Must be 4-32 MiB/s.
                            .setSubscribeMibPerSec(8)
                            .build())
                    .setCount(partitions))
            .setRetentionConfig(
                RetentionConfig.newBuilder()
                    // How long messages are retained.
                    .setPeriod(Durations.fromDays(1))
                    // Set storage per partition to 30 GiB. This must be 30 GiB-10 TiB.
                    // If the number of bytes stored in any of the topic's partitions grows
                    // beyond this value, older messages will be dropped to make room for
                    // newer ones, regardless of the value of `period`.
                    .setPerPartitionBytes(30 * 1024 * 1024 * 1024L))
            .setReservationConfig(
                ReservationConfig.newBuilder()
                    .setThroughputReservation(reservationPath.toString())
                    .build())
            .setName(topicPath.toString())
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic response = adminClient.createTopic(topic).get();
      if (regional) {
        System.out.println(response.getAllFields() + " (regional topic) created successfully.");
      } else {
        System.out.println(response.getAllFields() + " (zonal topic) created successfully.");
      }
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (AlreadyExistsException alreadyExists) {
        System.out.println("This topic already exists.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Python en las bibliotecas cliente de Pub/Sub Lite.

from google.api_core.exceptions import AlreadyExists
from google.cloud.pubsublite import AdminClient, Topic
from google.cloud.pubsublite.types import (
    CloudRegion,
    CloudZone,
    ReservationPath,
    TopicPath,
)
from google.protobuf.duration_pb2 import Duration

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

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

topic_path = None
if regional:
    #  A regional topic.
    topic_path = TopicPath(project_number, cloud_region, topic_id)
else:
    #  A zonal topic
    topic_path = TopicPath(
        project_number, CloudZone(cloud_region, zone_id), topic_id
    )

topic = Topic(
    name=str(topic_path),
    partition_config=Topic.PartitionConfig(
        # A topic must have at least one partition.
        count=num_partitions,
        # Set throughput capacity per partition in MiB/s.
        capacity=Topic.PartitionConfig.Capacity(
            # Set publish throughput capacity per partition to 4 MiB/s. Must be >= 4 and <= 16.
            publish_mib_per_sec=4,
            # Set subscribe throughput capacity per partition to 4 MiB/s. Must be >= 4 and <= 32.
            subscribe_mib_per_sec=8,
        ),
    ),
    retention_config=Topic.RetentionConfig(
        # Set storage per partition to 30 GiB. This must be in the range 30 GiB-10TiB.
        # If the number of byptes stored in any of the topic's partitions grows beyond
        # this value, older messages will be dropped to make room for newer ones,
        # regardless of the value of `period`.
        per_partition_bytes=30 * 1024 * 1024 * 1024,
        # Allow messages to be retained for 7 days.
        period=Duration(seconds=60 * 60 * 24 * 7),
    ),
    reservation_config=Topic.ReservationConfig(
        throughput_reservation=str(reservation_path),
    ),
)

client = AdminClient(cloud_region)
try:
    response = client.create_topic(topic)
    if regional:
        print(f"{response.name} (regional topic) created successfully.")
    else:
        print(f"{response.name} (zonal topic) created successfully.")
except AlreadyExists:
    print(f"{topic_path} already exists.")

Después de crear el tema Lite, puedes escalar la capacidad de procesamiento y de almacenamiento por partición. También puedes aumentar la cantidad de particiones, pero no disminuirla.

Cómo actualizar un tema de Lite

Puedes actualizar las siguientes propiedades de un tema de Lite:

  • La reserva asociada con el tema de Lite

  • Es la cantidad de particiones en el tema (solo se puede aumentar).

  • Los límites de capacidad de procesamiento de publicación y suscripción

  • El almacenamiento por partición

  • El tipo de retención de mensajes

Antes de escalar la capacidad de procesamiento o la de almacenamiento de un tema, consulta Ajusta la capacidad de procesamiento y Escala la capacidad de almacenamiento.

Puedes actualizar un tema Lite con la consola de Google Cloud, Google Cloud CLI o la API de Pub/Sub Lite.

Console

  1. Ve a la página Temas de Lite.

    Ir a los temas de Lite

  2. Haz clic en el ID del tema de Lite.

  3. Haz clic en Editar.

  4. Puedes realizar cualquiera de las siguientes actualizaciones o todas:

    • Usa una reserva diferente. Para los temas zonales, puedes optar por no usar una reserva.
    • Ingresa la cantidad de particiones. Este valor se puede aumentar, pero no disminuir.
    • Habilita o inhabilita la capacidad de procesamiento máxima permitida de publicación y suscripción.
    • Para los temas zonales, actualiza la capacidad de procesamiento de publicación y suscripción reservada. Para los temas con una reserva adjunta, la capacidad de procesamiento actualizada refleja el nuevo límite máximo.
    • Edita la capacidad de almacenamiento por partición.
    • Edita el período de retención de mensajes.
  5. Haz clic en Update.

gcloud

Para actualizar un tema de Lite, usa el comando gcloud pubsub lite-topics update:

gcloud pubsub lite-topics update TOPIC_ID \
  --location=LOCATION \
  --partitions=NUMBER_OF_PARTITIONS \
  --per-partition-publish-mib=publish_CAPACITY \
  --per-partition-subscribe-mib=subscribe_CAPACITY \
  --per-partition-bytes=STORAGE_PER_PARTITION \
  --message-retention-period=MESSAGE_RETENTION_PERIOD

Reemplaza lo siguiente:

  • TOPIC_ID: el ID del tema de Lite

  • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

  • NUMBER_OF_PARTITIONS: Es la cantidad de particiones que se configurarán para el tema de Lite.

  • publish_CAPACITY: Un número entero para la capacidad de procesamiento de publicación de cada partición

  • subscribe_CAPACITY: Es un número entero para la capacidad de procesamiento de suscripción de cada partición.

  • STORAGE_PER_PARTITION: la cantidad de almacenamiento para cada partición, como 30GiB

  • MESSAGE_RETENTION_PERIOD: la cantidad de tiempo que el tema de Lite almacena mensajes, como 1d o 2w

Si la solicitud es exitosa, la línea de comandos muestra el tema de Lite:

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

Protocolo

Para actualizar un tema de Lite, envía una solicitud PATCH como la siguiente:

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)

Reemplaza lo siguiente:

  • REGION: Es la región en la que se encuentra el tema de Lite.

  • PROJECT_NUMBER: el número del proyecto con el tema de Lite

  • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

  • TOPIC_ID: el ID del tema de Lite

Especifica los siguientes campos en el cuerpo de la solicitud:

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

Reemplaza lo siguiente:

  • publish_CAPACITY: Un número entero para la capacidad de procesamiento de publicación de cada partición

  • subscribe_CAPACITY: Es un número entero para la capacidad de procesamiento de suscripción de cada partición.

  • STORAGE_PER_PARTITION: la cantidad de almacenamiento para cada partición, como 30GiB

  • MESSAGE_RETENTION_PERIOD: la cantidad de tiempo que el tema de Lite almacena mensajes, como 1d o 2w

  • NUMBER_OF_PARTITIONS: Es la cantidad de particiones que se configurarán para el tema de Lite.

Si la solicitud se realiza correctamente, la respuesta es el tema de Lite en formato JSON:

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

Go

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Go en las bibliotecas cliente de Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/pubsublite"
)

func updateTopic(w io.Writer, projectID, region, location, topicID, reservation string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	// reservation := "projects/my-project-id/reservations/my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	// For ranges of fields in TopicConfigToUpdate, see https://pkg.go.dev/cloud.google.com/go/pubsublite/#TopicConfigToUpdate
	config := pubsublite.TopicConfigToUpdate{
		Name:                       topicPath,
		PartitionCount:             3, // Partition count cannot decrease.
		PublishCapacityMiBPerSec:   8,
		SubscribeCapacityMiBPerSec: 16,
		PerPartitionBytes:          60 * 1024 * 1024 * 1024,
		RetentionDuration:          24 * time.Hour,
		ThroughputReservation:      reservation,
	}
	updatedCfg, err := client.UpdateTopic(ctx, config)
	if err != nil {
		return fmt.Errorf("client.UpdateTopic got err: %w", err)
	}
	fmt.Fprintf(w, "Updated topic: %v\n", updatedCfg)
	return nil
}

Java

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Java en las bibliotecas cliente de Pub/Sub Lite.

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig;
import com.google.cloud.pubsublite.proto.Topic.PartitionConfig.Capacity;
import com.google.cloud.pubsublite.proto.Topic.ReservationConfig;
import com.google.cloud.pubsublite.proto.Topic.RetentionConfig;
import com.google.protobuf.FieldMask;
import com.google.protobuf.util.Durations;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

public class UpdateTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    String topicId = "your-topic-id";
    String reservationId = "your-reservation-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    updateTopicExample(cloudRegion, zoneId, projectNumber, topicId, reservationId, regional);
  }

  public static void updateTopicExample(
      String cloudRegion,
      char zoneId,
      long projectNumber,
      String topicId,
      String reservationId,
      boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    Iterable<String> iterablePaths =
        Arrays.asList(
            "partition_config.scale",
            "retention_config.per_partition_bytes",
            "retention_config.period",
            "reservation_config.throughput_reservation");

    FieldMask fieldMask = FieldMask.newBuilder().addAllPaths(iterablePaths).build();

    Topic topic =
        Topic.newBuilder()
            .setPartitionConfig(
                PartitionConfig.newBuilder()
                    .setCapacity(
                        Capacity.newBuilder()
                            .setPublishMibPerSec(16)
                            .setSubscribeMibPerSec(32)
                            .build())
                    .build())
            .setRetentionConfig(
                RetentionConfig.newBuilder()
                    // Set storage per partition to 32 GiB. This must be 30 GiB-10 TiB.
                    // If the number of bytes stored in any of the topic's partitions grows
                    // beyond this value, older messages will be dropped to make room for
                    // newer ones, regardless of the value of `period`.
                    // Be careful when decreasing storage per partition as it may cause
                    // lost messages.
                    .setPerPartitionBytes(32 * 1024 * 1024 * 1024L)
                    .setPeriod(Durations.fromDays(7)))
            .setReservationConfig(
                ReservationConfig.newBuilder()
                    .setThroughputReservation(reservationPath.toString())
                    .build())
            .setName(topicPath.toString())
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic topicBeforeUpdate = adminClient.getTopic(topicPath).get();
      System.out.println("Before update: " + topicBeforeUpdate.getAllFields());

      Topic topicAfterUpdate = adminClient.updateTopic(topic, fieldMask).get();
      System.out.println("After update: " + topicAfterUpdate.getAllFields());
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Python en las bibliotecas cliente de Pub/Sub Lite.

from google.api_core.exceptions import NotFound
from google.cloud.pubsublite import AdminClient, Topic
from google.cloud.pubsublite.types import (
    CloudRegion,
    CloudZone,
    ReservationPath,
    TopicPath,
)
from google.protobuf.duration_pb2 import Duration
from google.protobuf.field_mask_pb2 import FieldMask

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

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

topic_path = TopicPath(project_number, location, topic_id)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

# Defines which topic fields to update.
field_mask = FieldMask(
    paths=[
        "partition_config.capacity",
        "retention_config.per_partition_bytes",
        "retention_config.period",
        "reservation_confing.throughput_reservation",
    ]
)

# Defines how to update the topic fields.
topic = Topic(
    name=str(topic_path),
    partition_config=Topic.PartitionConfig(
        capacity=Topic.PartitionConfig.Capacity(
            publish_mib_per_sec=16,
            subscribe_mib_per_sec=32,
        )
    ),
    retention_config=Topic.RetentionConfig(
        # Set storage per partition to 32 GiB. This must be in the range 30 GiB-10TiB.
        # If the number of byptes stored in any of the topic's partitions grows beyond
        # this value, older messages will be dropped to make room for newer ones,
        # regardless of the value of `period`.
        # Be careful when decreasing storage per partition as it may cuase lost messages.
        per_partition_bytes=32 * 1024 * 1024 * 1024,
        # Allow messages to be stored for 14 days.
        period=Duration(seconds=60 * 60 * 24 * 14),
    ),
    reservation_config=Topic.ReservationConfig(
        throughput_reservation=str(reservation_path),
    ),
)

client = AdminClient(cloud_region)
try:
    response = client.update_topic(topic, field_mask)
    print(f"{response.name} updated successfully.")
except NotFound:
    print(f"{topic_path} not found.")

Ver detalles del tema de Lite

Puedes obtener detalles sobre un tema Lite con la consola de Google Cloud, Google Cloud CLI o la API Lite de Pub/Sub.

Console

  1. Ve a la página Temas de Lite.

    Ir a los temas de Lite

  2. Haz clic en el ID del tema de Lite.

gcloud

Para obtener detalles sobre un tema de Lite, usa el comando gcloud pubsub lite-topics describe:

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

Reemplaza lo siguiente:

  • TOPIC_ID: el ID del tema de Lite

  • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

Si la solicitud es exitosa, la línea de comandos muestra el tema de Lite:

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

Protocolo

Para obtener detalles sobre un tema de Lite, envía una solicitud GET como la siguiente:

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

Reemplaza lo siguiente:

  • REGION: Es la región en la que se encuentra el tema de Lite.

  • PROJECT_NUMBER: el número del proyecto con el tema de Lite

  • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

  • TOPIC_ID: el ID del tema de Lite

Si la solicitud se realiza correctamente, la respuesta es el tema de Lite en formato JSON:

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

Go

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Go en las bibliotecas cliente de Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func getTopic(w io.Writer, projectID, region, location, topicID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	topic, err := client.Topic(ctx, topicPath)
	if err != nil {
		return fmt.Errorf("client.Topic got err: %w", err)
	}
	fmt.Fprintf(w, "Got topic: %#v\n", *topic)
	return nil
}

Java

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Java en las bibliotecas cliente de Pub/Sub Lite.

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import com.google.cloud.pubsublite.proto.Topic;
import java.util.concurrent.ExecutionException;

public class GetTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    // Choose an existing topic.
    String topicId = "your-topic-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    getTopicExample(cloudRegion, zoneId, projectNumber, topicId, regional);
  }

  public static void getTopicExample(
      String cloudRegion, char zoneId, long projectNumber, String topicId, boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Topic topic = adminClient.getTopic(topicPath).get();
      long numPartitions = adminClient.getTopicPartitionCount(topicPath).get();
      System.out.println(topic.getAllFields() + "\nhas " + numPartitions + " partition(s).");
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }
}

Python

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Python en las bibliotecas cliente de Pub/Sub Lite.

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

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

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

topic_path = TopicPath(project_number, location, topic_id)

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

Enumerar temas Lite

Puedes enumerar los temas Lite en un proyecto con la consola de Google Cloud, Google Cloud CLI o la API de Pub/Sub Lite.

Console

  • Para ver una lista de los temas de Lite en un proyecto, ve a la página Temas de Lite.

    Ir a los temas de Lite

gcloud

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

Reemplaza LOCATION por el nombre de la ubicación en la que se encuentra el tema Lite.

Si la solicitud se realiza correctamente, la línea de comandos muestra los temas de Lite:

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

Protocolo

Para enumerar los temas de Lite en un proyecto, envía una solicitud GET como la siguiente:

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

Reemplaza lo siguiente:

  • REGION: Es la región en la que se encuentra el tema de Lite.

  • PROJECT_NUMBER: el número del proyecto con el tema de Lite

Si la solicitud se realiza correctamente, la respuesta es una lista de temas de Lite en formato JSON:

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

Go

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Go en las bibliotecas cliente de Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
	"google.golang.org/api/iterator"
)

func listTopics(w io.Writer, projectID, region, zone string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// zone := "us-central1-a"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	parent := fmt.Sprintf("projects/%s/locations/%s", projectID, zone)
	topicIter := client.Topics(ctx, parent)
	for {
		topic, err := topicIter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("topicIter.Next got err: %w", err)
		}
		fmt.Fprintf(w, "Got topic: %#v\n", topic)
	}
	return nil
}

Java

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Java en las bibliotecas cliente de Pub/Sub Lite.

import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.LocationPath;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.proto.Topic;
import java.util.List;

public class ListTopicsExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = true;

    listTopicsExample(cloudRegion, zoneId, projectNumber, regional);
  }

  public static void listTopicsExample(
      String cloudRegion, char zoneId, long projectNumber, boolean regional) throws Exception {

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    LocationPath locationPath =
        LocationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      List<Topic> topics = adminClient.listTopics(locationPath).get();
      for (Topic topic : topics) {
        System.out.println(topic.getAllFields());
      }
      System.out.println(topics.size() + " topic(s) listed.");
    }
  }
}

Python

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Python en las bibliotecas cliente de Pub/Sub Lite.

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

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

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

location_path = LocationPath(project_number, location)

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

for topic in response:
    print(topic)

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

Cómo borrar un tema de Lite

Puedes borrar temas Lite con la consola de Google Cloud, Google Cloud CLI o la API Lite de Pub/Sub.

Console

  1. Ve a la página Temas de Lite.

    Ir a los temas de Lite

  2. Haz clic en el ID del tema de Lite.

  3. En la página Detalles del tema Lite, haz clic en Borrar.

  4. En el campo que aparece, ingresa delete para confirmar que deseas borrar el tema de Lite.

  5. Haz clic en Borrar.

gcloud

Para borrar un tema de Lite, usa el comando gcloud pubsub lite-topics delete:

  1. Ejecuta el comando delete:

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

    Reemplaza lo siguiente:

    • TOPIC_ID: el ID del tema de Lite

    • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

  2. Para confirmar, ingresa Y.

Si la solicitud es correcta, la respuesta es la siguiente:

Deleted topic [TOPIC_ID].

Protocolo

Para borrar un tema Lite, envía una solicitud DELETE como la siguiente:

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

Reemplaza lo siguiente:

  • REGION: Es la región en la que se encuentra el tema de Lite.

  • PROJECT_NUMBER: el número del proyecto con el tema de Lite

  • LOCATION: Es el nombre de la ubicación en la que se encuentra el tema Lite.

  • TOPIC_ID: el ID del tema de Lite

Si la solicitud es correcta, la respuesta es un objeto JSON vacío.

Go

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Go en las bibliotecas cliente de Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func deleteTopic(w io.Writer, projectID, region, location, topicID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// NOTE: location can be either a region ("us-central1") or a zone ("us-central1-a")
	// For a list of valid locations, see https://cloud.google.com/pubsub/lite/docs/locations.
	// location := "us-central1"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	topicPath := fmt.Sprintf("projects/%s/locations/%s/topics/%s", projectID, location, topicID)
	err = client.DeleteTopic(ctx, topicPath)
	if err != nil {
		return fmt.Errorf("client.DeleteTopic got err: %w", err)
	}
	fmt.Fprint(w, "Deleted topic\n")
	return nil
}

Java

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Java en las bibliotecas cliente de Pub/Sub Lite.

import com.google.api.gax.rpc.NotFoundException;
import com.google.cloud.pubsublite.AdminClient;
import com.google.cloud.pubsublite.AdminClientSettings;
import com.google.cloud.pubsublite.CloudRegion;
import com.google.cloud.pubsublite.CloudRegionOrZone;
import com.google.cloud.pubsublite.CloudZone;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.TopicName;
import com.google.cloud.pubsublite.TopicPath;
import java.util.concurrent.ExecutionException;

public class DeleteTopicExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String cloudRegion = "your-cloud-region";
    char zoneId = 'b';
    // Choose an existing topic.
    String topicId = "your-topic-id";
    long projectNumber = Long.parseLong("123456789");
    // True if using a regional location. False if using a zonal location.
    // https://cloud.google.com/pubsub/lite/docs/topics
    boolean regional = false;

    deleteTopicExample(cloudRegion, zoneId, projectNumber, topicId, regional);
  }

  public static void deleteTopicExample(
      String cloudRegion, char zoneId, long projectNumber, String topicId, boolean regional)
      throws Exception {

    CloudRegionOrZone location;
    if (regional) {
      location = CloudRegionOrZone.of(CloudRegion.of(cloudRegion));
    } else {
      location = CloudRegionOrZone.of(CloudZone.of(CloudRegion.of(cloudRegion), zoneId));
    }

    TopicPath topicPath =
        TopicPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(location)
            .setName(TopicName.of(topicId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      adminClient.deleteTopic(topicPath).get();
      if (regional) {
        System.out.println(topicPath.toString() + " (regional topic) deleted successfully.");
      } else {
        System.out.println(topicPath.toString() + " (zonal topic) deleted successfully.");
      }
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This topic is not found.");
      } catch (Throwable throwable) {
        throwable.printStackTrace();
      }
    }
  }

Python

Antes de ejecutar esta muestra, sigue las instrucciones de configuración de Python en las bibliotecas cliente de Pub/Sub Lite.

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

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

cloud_region = CloudRegion(cloud_region)
topic_path = None
if regional:
    #  A regional topic.
    topic_path = TopicPath(project_number, cloud_region, topic_id)
else:
    #  A zonal topic
    topic_path = TopicPath(
        project_number, CloudZone(cloud_region, zone_id), topic_id
    )

client = AdminClient(cloud_region)
try:
    client.delete_topic(topic_path)
    if regional:
        print(f"{topic_path} (regional topic) deleted successfully.")
    else:
        print(f"{topic_path} (zonal topic) deleted successfully.")
except NotFound:
    print(f"{topic_path} not found.")

Si borras un tema de Lite, no podrás publicar mensajes en él. Las suscripciones Lite al tema de Lite aún existen, pero no puedes recibir mensajes de ellas.

Pasos siguientes