Criar e gerenciar tópicos do Lite

Neste documento, explicamos 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 exige um tópico ao qual os editores podem enviar mensagens para que os assinantes possam recebê-las. No Pub/Sub Lite, é possível criar um tópico do Lite por zona ou regional.

Um Lite zonal e um tópico do Lite regional são diferentes apenas na maneira como eles replicam dados. Todas as outras propriedades do tópico são as mesmas descritas em uma seção posterior deste 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. Os tópicos zonais do Pub/Sub Lite replicam dados em apenas uma zona. O Pub/Sub Lite replica os dados de forma assíncrona.

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

A disponibilidade de um tópico zonal do Pub/Sub Lite depende da disponibilidade do front-end e do armazenamento do aplicativo na zona configurada. Se o front-end ou o armazenamento do aplicativo passar por uma falha zonal, o tópico zonal do Lite ficará indisponível durante a interrupção.

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

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

  • Se o front-end e o armazenamento do aplicativo passarem por uma falha zonal, o tópico do Lite regional permanecerá disponível, desde que os dois componentes não comecem a falhar ao mesmo tempo.

  • Se o front-end e o armazenamento do aplicativo falharem simultaneamente, o tópico do Lite regional permanecerá indisponível durante a interrupção. Durante esse período, os clientes podem não publicar ou consumir mensagens, mas elas ainda serã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 de vários componentes em uma única zona. Como resultado, 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 pelas três propriedades a seguir:

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

    • Capacidade de assinatura (MiBps). É a taxa máxima em que as mensagens são encaminhadas para assinaturas do Lite.

    • Armazenamento (GiB). O tamanho máximo das mensagens na partição. A capacidade mínima configurável 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. Por exemplo, se um tópico do Lite tiver 8 partições e cada partição tiver o tamanho 30 GiB, a capacidade total de armazenamento do tópico do Lite será de 240 GiB (8 x 30).

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

  • Limite de assinaturas e cliente assinante. O Pub/Sub Lite oferece suporte a um único cliente 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 de assinantes que consomem mensagens a partir dela. Se mais clientes assinantes estiverem configurados, os clientes excedentes permanecerão inativos. O mesmo tópico com duas assinaturas pode ter até 10 clientes de assinantes, 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 processamento com reservas é necessário para o Lite regional e opcional para os tópicos do Lite por zona.

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

  • Configuração de armazenamento. Para configurar o armazenamento, você precisa especificar a capacidade de armazenamento e, opcionalmente, o período de armazenamento de mensagens.

    • Período de retenção de mensagens. O período máximo de armazenamento de mensagens por um tópico do Lite. Se você não especificar um período de armazenamento de mensagens, o tópico Lite armazenará mensagens até que você exceda a capacidade de armazenamento.

    • Capacidade de armazenamento. A capacidade de tópicos do Pub/Sub Lite é determinada pelo número de partições no tópico e pela capacidade de armazenamento de cada partiçã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 capacidade de armazenamento para cada byte publicado. Os tópicos zonais do Lite usam um byte de capacidade de armazenamento para cada byte publicado.

    Se você exceder a capacidade de armazenamento, o serviço Pub/Sub Lite continuará publicando mensagens. No entanto, para criar mais capacidade de armazenamento, as mensagens mais antigas da partição são excluídas. A exclusão das mensagens mais antigas ocorre mesmo que elas estejam dentro do período de armazenamento. O serviço nunca exclui mensagens antes que o TTL expire, a menos que a remoção seja necessária para liberar espaço para mensagens recém-publicadas. Para informações sobre como a capacidade está relacionada aos preços, consulte Preços do Pub/Sub 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 estar no seguinte formato:

projects/project-identifier/collection/ID

  • project-identifier: precisa ser o ID ou 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 sinais 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 todos os outros caracteres especiais sejam codificados ou decodificados corretamente ao serem usados em URLs. Por exemplo, mi-tópico é um ID inválido. No entanto, mi-t%C3%B3pico é válido. Esse formato é importante ao fazer chamadas REST.

Aumente a capacidade de processamento de um tópico do Lite

Se você não usa as reservas do Lite, é possível definir a capacidade de cada partição de qualquer tópico zonal do Lite com um valor definido pelos seguintes limites:

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

  • Capacidade de assinatura entre 4 e 32 MiBps

Esses limites também se aplicam a partições associadas a uma reserva do Lite. Com as reservas, cada partição pode consumir qualquer capacidade de processamento dentro dos limites especificados, desde que a capacidade total da reserva não seja excedida. Também é possível definir um limite menor na 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. Não é possível diminuir o número de partições em um tópico.

Quando você altera 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 uma função hash. Atualizar o número de partições em um tópico modifica essa função hash. As mensagens com a mesma chave publicada após a atualização da 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 em que alguns editores usam a nova função hash e outros ainda usam a antiga.

Aumente 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 Google Cloud CLI ou a API Pub/Sub Lite.

Para ver 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.

    Acessar a página "Tópicos do Lite"

  2. Clique em Criar tópico Lite.

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

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

    Não é possível atualizar o local após a criação de um tópico.

  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, 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 de assinatura.

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

  5. Na seção Armazenamento de mensagens:

    1. Informe o armazenamento por partição.

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

  6. Confira 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 esta amostra, 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 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 esta amostra, siga as instruções de configuração do Java em 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 esta amostra, siga as instruções de configuração do Python em 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 as capacidades de armazenamento e 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 de capacidade de publicação e assinatura

  • O armazenamento por partição

  • O tipo de retenção de mensagens

Antes de escalonar a capacidade ou a capacidade de armazenamento de um tópico, consulte Escalonar a capacidade de processamento e Escalonar a capacidade de armazenamento.

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

Console

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

    Acessar a página "Tópicos do Lite"

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

  3. Clique em Editar.

  4. Você pode fazer qualquer uma ou todas as atualizações a seguir:

    • Use outra. Para tópicos zonais, você pode optar por não usar uma reserva.
    • Insira o número de partições. Esse valor pode ser aumentado, mas não reduzido.
    • Ative ou desative a capacidade máxima permitida de publicação e assinatura.
    • 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 armazenamento da mensagem.
  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 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 esta amostra, siga as instruções de configuração do Go em 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 esta amostra, siga as instruções de configuração do Java em 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 esta amostra, siga as instruções de configuração do Python em 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

É possível receber detalhes sobre um tópico do Lite usando o Console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub Lite.

Console

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

    Acessar a página "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 esta amostra, 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 esta amostra, siga as instruções de configuração do Java em 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 esta amostra, siga as instruções de configuração do Python em 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 esta amostra, 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 esta amostra, siga as instruções de configuração do Java em 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 esta amostra, siga as instruções de configuração do Python em 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 Google Cloud CLI ou a API Pub/Sub Lite.

Console

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

    Acessar a página "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 Excluir.

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 esta amostra, 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 esta amostra, siga as instruções de configuração do Java em 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 esta amostra, siga as instruções de configuração do Python em 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