Criar e gerenciar tópicos do Lite

Este documento explica como criar, visualizar e excluir um tópico do Pub/Sub Lite.

Visão geral de um tópico do Lite

Um serviço do Pub/Sub Lite requer um tópico que os editores possam enviar para que os assinantes possam recebê-las. No Pub/Sub Lite, é possível criar um tópico Lite regional ou zonal.

Um tópico do Lite zonal e um tópico do Lite regional diferem apenas na forma como replicam dados. Todas as outras propriedades dos tópicos são as mesmas descritas em uma seção posterior do este documento.

Replicação de dados em um tópico do Lite

Os tópicos regionais do Pub/Sub Lite armazenam dados em duas zonas de uma única região. Replicação dos tópicos zonais do Pub/Sub Lite dados em apenas uma zona. O Pub/Sub Lite replica dados de forma assíncrona.

A disponibilidade do Pub/Sub Lite depende da disponibilidade os componentes subjacentes, que incluem o front-end do aplicativo e armazenamento.

A disponibilidade de um tópico zonal do Pub/Sub Lite depende do disponibilidade do front-end e do armazenamento do aplicativo nos zona. Se o front-end ou o armazenamento do aplicativo apresentar uma falha zonal, o o tópico zonal do Lite fica indisponível durante a interrupção.

A disponibilidade de um tópico regional do Pub/Sub Lite depende da disponibilidade do front-end do aplicativo e do armazenamento na região configurada. Os seguintes tipos de falha são possíveis:

  • Se o front-end do aplicativo ou o armazenamento apresentar uma falha zonal, o tópico regional do Lite permanece disponível.

  • Se houver uma falha na zona tanto no front-end do aplicativo quanto no armazenamento, o o tópico regional do Lite permanece disponível desde que os dois componentes não apresentem falhas ao mesmo tempo tempo de resposta.

  • Se o front-end do aplicativo e o armazenamento falharem simultaneamente, o tópico regional do Lite vai permanecer indisponível durante a falha. Durante esse período, os clientes podem não conseguir publicar ou consumir mensagens, mas elas ainda são entregues na ordem correta.

Um tópico regional do Lite oferece proteção contra a maioria dos tipos de falhas de zona única. No entanto, em alguns casos raros, a natureza assíncrona da replicação pode causar uma falha simultânea em vários componentes de uma única zona. Como um tópico regional do Lite fica indisponível.

Propriedades de um tópico do Lite

Os tópicos do Lite têm as seguintes propriedades:

  • Número de partições. Uma partição é a unidade básica de paralelismo no Pub/Sub Lite. Um tópico do Lite pode ter uma ou mais partições.

  • Capacidade de uma partição. A capacidade de uma partição é descrita pelo estas três propriedades:

    • Capacidade de publicação (MiBps). A taxa máxima em que é possível publicar mensagens.

    • Capacidade de assinatura (MiBps). A taxa máxima onde as mensagens são encaminhadas para assinaturas do Lite.

    • Armazenamento (GiB). O tamanho máximo das mensagens na partição. A capacidade configurável mínima de uma partição é de 30 GiB.

  • Capacidade de armazenamento de um tópico do Lite. Todas as partições em um tópico do Lite têm a mesma capacidade de armazenamento configurada. A capacidade total de armazenamento de um tópico do Lite é a soma da capacidade de armazenamento de todas as partições no tópico. Para exemplo, se um tópico do Lite tiver 8 partições e cada partição for do tamanho 30 GiB, a capacidade total de armazenamento do tópico do Lite é de 240 GiB (8 x 30).

  • Capacidade de processamento de um tópico do Lite. A capacidade de processamento consiste capacidade total de publicação e assinatura de todas as partições na Tópico do Lite. Mesmo que você tenha um tópico que, no total, possa oferecer suporte a 1 GiBps de capacidade de publicação, o limite de publicação por partição é o que limita a capacidade.

  • Limite de cliente assinante e assinaturas. O Pub/Sub Lite oferece suporte a um único cliente de assinante para uma única partição e uma única assinatura. Por exemplo, uma assinatura em um tópico com cinco partições pode ter: no máximo, cinco clientes assinantes que consomem suas mensagens. Se mais clientes assinantes forem configurados, os clientes em excesso permanecerão inativos. O mesmo tema com 2 as assinaturas podem ter até 10 clientes inscritos, 5 clientes para cada assinatura.

  • Reservas. Uma reserva é a maneira mais fácil de provisionar e gerenciar a capacidade de processamento de vários tópicos. O provisionamento da capacidade de transferência com reservas é obrigatório para o Lite regional e opcional para tópicos do Lite zonal.

    Se você não usar reservas para um tópico zonal do Lite, será preciso explicitamente provisionar a capacidade de processamento de publicação e assinatura do tópico. Sem uma reserva, todas as partições em um tópico do Lite têm as mesmas e a capacidade de processamento configurada. Para saber mais, consulte Configurar capacidade de processamento sem reservas.

  • Configuração de armazenamento. Para configurar o armazenamento, é preciso especificar capacidade de armazenamento e, opcionalmente, o período de armazenamento de mensagens.

    • Período de retenção de mensagens. A quantidade máxima de tempo para a qual um Lite armazena mensagens. Se você não especificar um período de retenção de mensagens, o tópico do Lite vai armazenar mensagens até exceder a capacidade de armazenamento.

    • Capacidade de armazenamento. A capacidade do tópico do Pub/Sub Lite é determinadas pelo número de partições do tópico e pela capacidade de armazenamento de cada partição. O armazenamento por partição é a quantidade de armazenamento em bytes para cada partição. Os tópicos regionais do Lite usam dois bytes de armazenamento para cada byte publicado. Os tópicos do Zonal Lite usam um byte de capacidade de armazenamento para cada byte publicado.

    Se você exceder a capacidade de armazenamento, o serviço do Pub/Sub Lite continua a publicar mensagens. No entanto, para aumentar o armazenamento capacidade, as mensagens mais antigas da partição são excluídas. A exclusão de as mensagens mais antigas são exibidas mesmo que estejam dentro da mensagem período de armazenamento. O serviço nunca exclui mensagens antes do TTL expire, a menos que a remoção seja necessária para liberar espaço para textos mensagens. Para informações sobre como a capacidade se relaciona com os preços, consulte Pub/Sub Preços do Lite.

Diretrizes para nomear um tópico

Um nome de recurso do Pub/Sub Lite identifica exclusivamente um recurso do Pub/Sub Lite, como um tópico, uma assinatura ou uma reserva. O nome do recurso precisa ter o seguinte formato:

projects/project-identifier/collection/ID

  • project-identifier: precisa ser o ID ou o número do projeto, disponível no console do Google Cloud. Por exemplo, my-cool-project é um ID do projeto. 123456789123 é um número de projeto.

  • collection: precisa ser topics, subscriptions ou reservations.

  • ID: precisa estar em conformidade com as seguintes diretrizes:

    • não começar com a string goog;
    • Começar com uma letra
    • conter entre 3 e 255 caracteres;
    • conter apenas os seguintes caracteres: letras [A-Za-z], números [0-9], traços -, sublinhados _, pontos ., til ~, sinais de adição + e símbolos de porcentagem %

    É possível usar os caracteres especiais da lista anterior em nomes de recursos sem codificação para URL. No entanto, é preciso garantir que os demais caracteres especiais sejam codificados ou decodificados corretamente quando usados em URLs. Por exemplo, mi-tópico é um ID inválido. No entanto, mi-t%C3%B3pico é válido. Esse formato é importante quando você faz chamadas REST.

Aumentar a capacidade de um tópico do Lite

Se você não usa reservas do Lite, pode definir a capacidade de processamento de cada partição de qualquer tópico do Lite zonal para um valor definido pelos seguintes limites:

  • Capacidade de publicação entre 4 e 16 MiBps

  • Capacidade de processamento de assinatura entre 4 e 32 MiBps

Esses limites também se aplicam a partições associadas a uma reserva Lite. Com as reservas, cada partição pode consumir qualquer capacidade de processamento os limites especificados, desde que a capacidade total a reserva não seja excedida. Como opção, é possível definir um limite inferior a capacidade real por partição para tornar o tráfego mais previsível.

É possível aumentar o número de partições em um tópico para escaloná-lo horizontalmente. O número de partições em um tópico não pode ser diminuído.

Quando você muda o número de partições, a ordem relativa das mensagens não é preservada. Internamente, as mensagens são atribuídas a partições usando um hash função. Atualizar o número de partições em um tópico altera este hash função. As mensagens com a mesma chave publicadas após a atualização na contagem de partições provavelmente serão mapeadas para uma partição diferente daquelas publicadas antes da atualização.

Além disso, o redimensionamento do tópico leva alguns segundos para ser propagado para todos os editores. Há pouco tempo, alguns editores usam a nova função hash e alguns ainda estão usando a antiga.

Aumentar a capacidade de armazenamento de um tópico do Lite

É possível aumentar ou diminuir a quantidade de armazenamento em um tópico do Lite. O tópico Lite fornece a mesma quantidade de armazenamento para cada partição. Se você aumentar o armazenamento para 60 GiB, cada uma delas terá 60 GiB de armazenamento.

Se você diminuir a quantidade de armazenamento em um tópico Lite, o serviço Pub/Sub Lite removerá primeiro as mensagens mais antigas.

Para ver informações sobre como a capacidade está relacionada aos preços, consulte Preços do Pub/Sub Lite

Criar um tópico do Lite

É possível criar tópicos do Lite com o console do Google Cloud, a CLI do Google Cloud ou a API Pub/Sub Lite.

Para uma lista das regiões e zonas disponíveis, consulte Locais do Pub/Sub Lite.

Console

  1. Acesse a página Tópicos do Lite.

    Acesse os tópicos do Lite

  2. Clique em Criar tópico Lite.

    1. Para criar um tópico do Lite zonal, selecione uma região e uma zona dentro dela.

    2. Para criar um tópico regional do Lite, selecione uma região.

    Não é possível atualizar o local depois que um tópico é criado.

  3. Na seção Nome, insira um ID de tópico Lite.

    O nome do tópico do Lite inclui o ID do tópico do Lite, o local e o número do projeto.

  4. Na seção Capacidade de processamento:

    1. Selecione ou crie uma reserva.

      Isso é opcional para um tópico zonal do Lite e obrigatório para um tópico regional do Lite.

    2. Insira o pico da capacidade de processamento de publicação e o pico da capacidade de processamento de assinatura.

      Várias partições são definidas automaticamente com base nas suas entradas. É possível editar esse número depois de salvar o tópico.

  5. Na seção Armazenamento de mensagens:

    1. Insira o armazenamento por partição.

    2. Selecione uma das duas opções para o período de armazenamento de mensagens.

  6. Revise as mudanças e clique em Criar.

gcloud

Para criar um tópico do Lite, use o 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]

Substitua:

  • TOPIC_ID: o ID do tópico do Lite

  • LOCATION: o nome de um local compatível com o Pub/Sub Lite;

  • NUMBER_OF_PARTITIONS: um número inteiro para o número de partições no tópico Lite

  • STORAGE_PER_PARTITION: a quantidade de armazenamento em cada partição, como 30GiB.

  • RESERVATION_NAME: o caminho totalmente qualificado de uma reserva do Lite, como projects/123456789/locations/us-west1/reservations/my-reservation.

  • MESSAGE_RETENTION_PERIOD: a quantidade de tempo em que o tópico do Lite armazena mensagens, como 1d ou 2w

Se a solicitação for bem-sucedida, a linha de comando exibirá uma confirmação:

Created [TOPIC_ID].

Protocolo

Para criar um tópico Lite, envie uma solicitação POST como esta:

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

Substitua:

Especifique os campos a seguir no corpo da solicitação:

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

Substitua:

  • NUMBER_OF_PARTITIONS: um número inteiro para o número de partições no tópico Lite

  • STORAGE_PER_PARTITION: a quantidade de armazenamento em cada partição, como 30GiB.

  • publish_CAPACITY: um número inteiro para a capacidade de publicação de cada partição.

  • subscribe_CAPACITY: um número inteiro para a capacidade de assinatura de cada partição.

  • MESSAGE_RETENTION_PERIOD: a quantidade de tempo em que o tópico do Lite armazena mensagens, como 1d ou 2w

  • RESERVATION_NAME: o caminho totalmente qualificado de uma reserva do Lite, como projects/123456789/locations/us-west1/reservations/my-reservation.

Se a solicitação for bem-sucedida, a resposta será o tópico do Lite no 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 executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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.")

Depois de criar o tópico do Lite, é possível escalonar a capacidade de armazenamento e processamento por partição. Também é possível aumentar, mas não diminuir, o número de partições.

Atualizar um tópico do Lite

É possível atualizar as seguintes propriedades de um tópico do Lite:

  • A reserva associada ao tópico do Lite

  • O número de partições no tópico (só pode ser aumentado)

  • Os limites da capacidade de processamento de publicação e assinatura

  • O armazenamento por partição

  • O tipo de retenção de mensagens

Antes de aumentar a capacidade de processamento ou de armazenamento de um tópico, consulte Aumente a capacidade de processamento e Aumente a capacidade de armazenamento.

É possível atualizar um tópico do Lite com o console do Google Cloud, a Google Cloud CLI ou API Pub/Sub Lite.

Console

  1. Acesse a página Tópicos do Lite.

    Acesse os tópicos do Lite

  2. Clique no ID do tópico do Lite.

  3. Clique em Editar.

  4. É possível fazer as seguintes atualizações:

    • Use outra reserva. Para tópicos zonais, opte por não usar uma reserva.
    • Insira o número de partições. Esse valor pode ser aumentado, mas não diminuído.
    • Ative ou desative a capacidade máxima de publicação e assinatura permitida.
    • Para tópicos zonais, atualize a capacidade reservada de publicação e assinatura. Para tópicos com uma reserva anexada, a capacidade atualizada reflete o novo limite máximo.
    • Edite a capacidade de armazenamento por partição.
    • Edite o período de retenção de mensagens.
  5. Clique em Atualizar.

gcloud

Para atualizar um tópico do Lite, use o 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

Substitua:

  • TOPIC_ID: o ID do tópico do Lite

  • LOCATION: o nome do local em que o tópico do Lite está;

  • NUMBER_OF_PARTITIONS: o número de partições a serem configuradas para o tópico do Lite.

  • publish_CAPACITY: um número inteiro para a capacidade de publicação de cada partição.

  • subscribe_CAPACITY: um número inteiro para a capacidade de assinatura de cada partição.

  • STORAGE_PER_PARTITION: a quantidade de armazenamento em cada partição, como 30GiB.

  • MESSAGE_RETENTION_PERIOD: a quantidade de tempo em que o tópico do Lite armazena mensagens, como 1d ou 2w

Se a solicitação for bem-sucedida, a linha de comando exibirá o tópico 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 atualizar um tópico do Lite, envie uma solicitação PATCH como a seguinte:

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)

Substitua:

  • REGION: a região em que o tópico do Lite está;

  • PROJECT_NUMBER: o número do projeto com o tópico Lite

  • LOCATION: o nome do local em que o tópico do Lite está;

  • TOPIC_ID: o ID do tópico do Lite

Especifique os campos a seguir no corpo da solicitação:

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

Substitua:

  • publish_CAPACITY: um número inteiro para a capacidade de processamento de publicação. de cada partição

  • subscribe_CAPACITY: um número inteiro para a capacidade de assinatura de cada partição.

  • STORAGE_PER_PARTITION: a quantidade de armazenamento em cada partição, como 30GiB.

  • MESSAGE_RETENTION_PERIOD: a quantidade de tempo em que o tópico do Lite armazena mensagens, como 1d ou 2w

  • NUMBER_OF_PARTITIONS: o número de partições a serem configuradas para o tópico do Lite.

Se a solicitação for bem-sucedida, a resposta será o tópico do Lite no 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 executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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.")

Mais detalhes do tópico do Lite

Para mais detalhes sobre um tópico do Lite, use o Console do Google Cloud, a CLI do Google Cloud ou a API Pub/Sub Lite.

Console

  1. Acesse a página Tópicos do Lite.

    Acessar tópicos do Lite

  2. Clique no ID do tópico do Lite.

gcloud

Para ver detalhes sobre um tópico Lite, use o comando gcloud pubsub lite-topics describe:

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

Substitua:

  • TOPIC_ID: o ID do tópico do Lite

  • LOCATION: o nome do local em que o tópico do Lite está.

Se a solicitação for bem-sucedida, a linha de comando exibirá o tópico 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 ver detalhes sobre um tópico do Lite, envie uma solicitação GET como a seguinte:

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

Substitua:

  • REGION: a região em que o tópico do Lite está;

  • PROJECT_NUMBER: o número do projeto com o tópico Lite

  • LOCATION: o nome do local em que o tópico do Lite está;

  • TOPIC_ID: o ID do tópico do Lite

Se a solicitação for bem-sucedida, a resposta será o tópico do Lite no 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 executar este exemplo, siga as instruções de configuração do Go em Bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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.")

Listar tópicos do Lite

É possível listar tópicos do Lite em um projeto usando o console do Google Cloud. a Google Cloud CLI ou a API Pub/Sub Lite.

Console

gcloud

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

Substitua LOCATION pelo nome do local em que o tópico do Lite está.

Se a solicitação for bem-sucedida, a linha de comando exibirá os tópicos do 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 listar os tópicos do Lite em um projeto, envie uma solicitação GET como esta:

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

Substitua:

  • REGION: a região em que o tópico do Lite está;

  • PROJECT_NUMBER: o número do projeto com o tópico Lite

Se a solicitação for bem-sucedida, a resposta será uma lista de tópicos Lite no formato JSON:

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

Go

Antes de executar este exemplo, siga as instruções de configuração do Go em Bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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.")

Excluir um tópico do Lite

É possível excluir tópicos do Lite com o console do Google Cloud, a CLI do Google Cloud ou a API Pub/Sub Lite.

Console

  1. Acesse a página Tópicos do Lite.

    Acesse os tópicos do Lite

  2. Clique no ID do tópico do Lite.

  3. Na página Detalhes do tópico do Lite, clique em Excluir.

  4. No campo exibido, digite delete para confirmar que você quer excluir o tópico do Lite.

  5. Clique em Delete.

gcloud

Para excluir um tópico do Lite, use o comando gcloud pubsub lite-topics delete:

  1. Execute o comando delete:

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

    Substitua:

    • TOPIC_ID: o ID do tópico do Lite

    • LOCATION: o nome do local em que o tópico do Lite está.

  2. Para confirmar, digite Y.

Se a solicitação for bem-sucedida, a resposta será:

Deleted topic [TOPIC_ID].

Protocolo

Para excluir um tópico do Lite, envie uma solicitação DELETE como a seguinte:

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

Substitua:

  • REGION: a região em que o tópico do Lite está;

  • PROJECT_NUMBER: o número do projeto com o tópico Lite

  • LOCATION: o nome do local em que o tópico do Lite está;

  • TOPIC_ID: o ID do tópico do Lite

Se a solicitação for bem-sucedida, a resposta será um objeto JSON vazio.

Go

Antes de executar este exemplo, siga as instruções de configuração do Go em Bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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 executar este exemplo, siga as instruções de configuração do Java nas bibliotecas de cliente do 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.")

Se você excluir um tópico Lite, não será possível publicar mensagens nele. As assinaturas do Lite para o tópico do Lite ainda existem, mas não é possível receber mensagens das assinaturas do Lite.

A seguir