Crea y administra temas de Lite

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

Descripción general de un tema de Lite

Un servicio de Pub/Sub Lite requiere un tema al que los publicadores puedan enviar para que los suscriptores puedan recibirlos. En un radio de Pub/Sub Lite, puedes crear un entorno Lite zonal o regional en el tema.

Los temas Lite zonales y regionales de Lite solo se diferencian en la forma en que se replican de datos no estructurados. Todas las demás propiedades de temas 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. Replicación de temas zonales de Pub/Sub Lite datos dentro de 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 del frontend de la aplicación y del almacenamiento en su configuración zona. Si el frontend o el almacenamiento de la aplicación experimenta una falla zonal, el El tema zonal Lite no estará disponible mientras dure la interrupción.

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

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

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

  • Si el frontend y el almacenamiento de la aplicación fallan de forma simultánea, el tema regional Lite no estará disponible mientras dure 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 zonas únicas fallas. Sin embargo, en 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 velocidad 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 con la misma capacidad de almacenamiento configurada. La capacidad de almacenamiento total de un Lite es la suma de la capacidad de almacenamiento de todas las particiones del tema. Para Por ejemplo, si un tema de Lite tiene 8 particiones y cada partición es de tamaño 30 GiB, la capacidad de almacenamiento total del tema Lite es de 240 GiB (8 x 30).

  • Capacidad de procesamiento de un tema 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 respaldar 1 GiBps de capacidad de procesamiento de publicación, es el límite de publicación por partición que limita eficazmente la capacidad de procesamiento.

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

  • Reservas. Una reserva es la forma más fácil de aprovisionar y administrar de procesamiento para varios temas. Cómo aprovisionar la capacidad de procesamiento con reservas es obligatorio para Lite regional y es opcional para las cargas zonales Temas de Lite.

    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 de almacenamiento y, opcionalmente, el período de retención de mensajes.

    • Período de retención de mensajes. El tiempo máximo durante el que un dispositivo Lite un tema que 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 es determinadas por la cantidad de particiones del tema y la capacidad de almacenamiento de cada partición. 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 almacenamiento. para cada byte publicado. Los temas de Zonal Lite usan un byte 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 mensajes antes de su TTL a menos que sea necesario quitarlas para liberar espacio y mensajes nuevos. Para obtener información sobre cómo se relaciona la capacidad con los precios, consulta Pub/Sub Precios de 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 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
    • Contener 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 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 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 la reserva no se excede. 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 en 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 un hash . Actualizar la cantidad de particiones en un tema cambia este hash . Mensajes con la misma clave publicados después de la actualización del recuento de particiones se asignen a una partición diferente a las publicadas antes del 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 regional de Lite.

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

      Varias particiones se configuran automáticamente según tus entradas. Tú puede 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: La ruta completamente calificada de un Lite reserva 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: Es un número entero para la capacidad de procesamiento de suscripción. capacidad de cada partición

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

  • RESERVATION_NAME: La ruta completamente calificada de un Lite reserva 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 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 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 puede aumentar, pero no disminuir el número de y particiones.

Actualizar un tema de Lite

Puedes actualizar las siguientes propiedades de un tema de Lite:

  • La reserva asociada con el tema 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 procesamiento o la capacidad de almacenamiento de un consulta Escala la capacidad de procesamiento y Escala el almacenamiento capacidad.

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

  4. Puedes realizar cualquiera de las siguientes actualizaciones:

    • Usa una reserva diferente. En 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 los 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 Lite.

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

  • 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

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 este ejemplo, sigue las instrucciones de configuración de Go en 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 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 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 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 usando 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 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.")

Borrar un tema de Lite

Puedes borrar los temas 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. 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 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 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.

Qué sigue