Criar e gerenciar tópicos do Lite

Neste documento, explicamos como criar, visualizar e excluir um Pub/Sub Lite tópico.

Visão geral de um tópico do Lite

Um serviço do Pub/Sub Lite exige um tópico que os editores possam enviar para que os assinantes possam recebê-las. Dentro de no Pub/Sub Lite, é possível criar uma versão do Lite zonal ou regional tópico.

Um tópico zonal do Lite e um tópico regional do Lite diferem apenas na forma como se 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 os 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 do a 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 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 e o armazenamento do aplicativo falharem ao mesmo tempo, o o tópico regional do Lite permanece indisponível durante a interrupção. Durante esse período, os clientes podem não publicar ou consumir mensagens, mas elas ainda entregues na ordem certa.

Um tópico regional do Lite oferece proteção contra a maioria dos tipos de zonas únicas de segurança. 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 em 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 que permite 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 Lite é a soma da capacidade de armazenamento de todas as partições nele. 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 se você tiver um tópico que, de forma agregada, possa dar suporte 1 GiBps de capacidade de processamento de publicação. É o limite de publicação por partição que limita efetivamente a capacidade de processamento.

  • Limite de clientes e assinaturas do assinante. Pub/Sub Lite oferece suporte a um único cliente assinante para uma única partição 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 assinantes estiverem configurados, os clientes excedentes 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 e a capacidade de processamento para vários tópicos. Capacidade de provisionamento da capacidade com reservas é obrigatório para o Lite regional e é opcional para Tópicos do Lite.

    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 armazenamento de mensagens: A quantidade máxima de tempo para a qual um Lite armazena mensagens. Se você não especificar um período de armazenamento de mensagens, o O tópico do Lite armazena mensagens até que você exceda 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 zonais do Lite usam um byte de armazenamento para cada byte publicado.

    Se você exceder a capacidade de armazenamento, o serviço Pub/Sub Lite continua publicando 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 reserva. O nome do recurso precisa ter o 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 obedecer às 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 ., tils ~, 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 corretamente codificados ou decodificados ao usá-los 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 processamento de um tópico do Lite

Se você não usa reservas do Lite, defina a capacidade de processamento de cada partição de qualquer tópico zonal do Lite a 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 do 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. Não é possível reduzir 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 é preservados. 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. Mensagens com a mesma chave publicadas após a atualização da contagem de partições provavelmente serão mapeadas para uma partição diferente daquelas publicadas antes da atualizar.

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 Google Cloud CLI, 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.

    Acessar 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 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. Você poderá editar esse número após 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 um Lite reserva 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 processamento de publicação. de cada partição

  • subscribe_CAPACITY: um número inteiro para a capacidade de processamento 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 um Lite reserva 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 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 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, escalone a capacidade de processamento por partição e e a capacidade de armazenamento. Também é possível aumentar, mas não diminuir, o número de partições diferentes.

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 escalonar a capacidade de processamento ou de armazenamento consulte Escalonar a capacidade de processamento e Escalonar o armazenamento e a capacidade.

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

    Acessar tópicos do Lite

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

  3. Clique em Editar.

  4. É possível fazer qualquer uma ou todas as atualizações a seguir:

    • Use uma reserva diferente. 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 reduzido.
    • Ativar ou desativar 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.
    • Editar 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 processamento de publicação. de cada partição

  • subscribe_CAPACITY: um número inteiro para a capacidade de processamento 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 processamento 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 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 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 acessar detalhes sobre um tópico do Lite, use o 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 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 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 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