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 un radio de Pub/Sub Lite, puedes crear un entorno Lite zonal o regional en este tema.

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

Replicación de datos en un tema 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 en una sola zona. Pub/Sub Lite replica datos de forma asíncrona.

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

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

La disponibilidad de un tema regional de Pub/Sub Lite depende de la disponibilidad del frontend y el almacenamiento de la aplicación en su región configurada. Se pueden producir los siguientes tipos de fallas:

  • Si el frontend de la aplicación o el almacenamiento experimentan una falla zonal, el tema regional de Lite siga estando disponible.

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

  • Si fallan el frontend y el almacenamiento de la aplicación de forma simultánea, el tema de Lite regional permanecerá indisponible durante la interrupción. Durante este tiempo, es posible que los clientes no puedan publicar o consumir mensajes, pero estos aún y se entreguen en el orden correcto.

Un tema Lite regional 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 como resultado, un tema regional de Lite dejará 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 con las siguientes tres propiedades:

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

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

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

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

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

  • Límite de clientes suscriptores y suscripciones. Pub/Sub Lite admite un solo cliente suscriptor para una sola partición y una sola suscripción. Por ejemplo, una suscripción a un tema con 5 particiones puede tener, como máximo, 5 clientes suscriptores que consumen mensajes de él. Si tienes más suscriptores de la configuración predeterminada, los clientes excedentes permanecen inactivos. El mismo tema con 2 subscripciones puede tener hasta 10 clientes suscriptores, 5 clientes para cada suscripción.

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

    Si no usas reservas para un tema Lite zonal, debes aprovisionar la capacidad de procesamiento de publicación y suscripción del tema. Sin una reserva, todas las particiones de un tema Lite tienen el mismo la 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. Es la cantidad máxima de tiempo durante la cual un tema de Lite almacena mensajes. Si no especificas un período de retención de mensajes, El tema Lite almacena mensajes hasta que superes la capacidad de almacenamiento.

    • Capacidad de almacenamiento. La capacidad del tema de Pub/Sub Lite se determina según la cantidad de particiones en el tema y la capacidad de almacenamiento de cada una de ellas. El almacenamiento por partición es la cantidad de almacenamiento, en bytes, para cada partición. Ten en cuenta que los temas Lite regionales usan dos bytes de capacidad de almacenamiento para cada byte publicado. Los temas Lite zonales usan un byte de capacidad de almacenamiento para 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 almacenamiento se borran los mensajes más antiguos de la partición. La eliminación de los mensajes más antiguos aparecen incluso si están dentro del mensaje período de retención. El servicio nunca borra los mensajes antes de que venza su TTL, a menos que su eliminación sea necesaria para dejar espacio para los mensajes publicados recientemente. 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 temas

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

projects/project-identifier/collection/ID

  • project-identifier: Debe ser el ID o el número de 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
    • Tener 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 los nombres de recursos sin codificación de URL. Sin embargo, debes asegurarte de que los demás caracteres especiales estén codificados o decodificados de forma correcta 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 a REST.

Aumenta la capacidad de procesamiento de un tema de Lite

Si no usas las reservas de Lite, puedes configurar la capacidad de procesamiento de cada partición de cualquier tema zonal de Lite a 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

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

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

Cuando cambias la cantidad de particiones, el orden relativo de los mensajes no es y cómo se preservan. De forma interna, los mensajes se asignan a particiones con una función de hash. Si actualizas la cantidad de particiones de un tema, se cambia esta función de hash. Es probable que los mensajes con la misma clave publicados después de la actualización del recuento de particiones se asignen a una partición diferente de la que se publicaron antes de la actualización.

Además, el cambio de tamaño de un tema tarda unos segundos en propagarse a todos los editores. Habrá poco tiempo en que algunos editores usen la nueva hash y algunos aún usan la anterior.

Aumenta la capacidad de almacenamiento de un tema 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 de Pub/Sub Lite.

Para obtener una lista de las regiones y zonas disponibles, consulta 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 Lite zonal, selecciona una región y una zona dentro de ella.

    2. Para crear un tema Lite regional, selecciona una región.

    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 Lite incluye su ID, la ubicación y el número del proyecto.

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

    1. Selecciona o crea una reserva.

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

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

      Se establece una cantidad de particiones automáticamente en función de tus entradas. Puedes editar este número después de guardar el tema.

  5. En la sección Almacenamiento de mensajes, sigue estos pasos:

    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 de 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: Es un número entero para la capacidad de procesamiento de publicación. capacidad de cada partición

  • subscribe_CAPACITY: Un número entero para la capacidad de procesamiento de la 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 de 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 por partición y de almacenamiento de Google. También puedes aumentar, pero no disminuir, la cantidad de particiones.

Actualizar un tema de Lite

Puedes actualizar las siguientes propiedades de un tema de Lite:

  • La reserva asociada con el tema de Lite

  • La cantidad de particiones en el tema (solo se puede aumentar)

  • Los límites de la 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 rendimiento o la capacidad de almacenamiento de un tema, consulta Cómo escalar la capacidad de rendimiento y Cómo escalar la capacidad de almacenamiento.

Puedes actualizar un tema de 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 Temas Lite

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

  3. Haz clic en Edit.

  4. Puedes realizar cualquiera de las siguientes actualizaciones:

    • Usa otra reserva. En el caso de 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 Actualizar.

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

  • NUMBER_OF_PARTITIONS: Es la cantidad de particiones que se deben configurar 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. capacidad 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 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: Es un número entero para la capacidad de procesamiento de publicación. capacidad de cada partición

  • subscribe_CAPACITY: Es un número entero para la capacidad de procesamiento de suscripción. capacidad 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 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.")

Consulta los detalles del tema de Lite

Puedes obtener información sobre un tema Lite en el 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 Temas 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 de 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 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 este ejemplo, sigue las instrucciones de configuración de Go en 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 de 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 Temas 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 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 este ejemplo, sigue las instrucciones de configuración de Go en 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.")

Borra un tema de Lite

Puedes borrar temas de 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 Temas 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 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