Criar e gerenciar reservas do Lite

Neste documento, explicamos como usar e gerenciar reservas do Pub/Sub Lite. Este documento também explica o conceito de unidades de capacidade e como determinar quantas você precisa para acomodar o throughput do seu aplicativo.

Visão geral das reservas do Lite

As reservas do Lite provisionam e compartilham dinamicamente a capacidade de processamento entre um ou vários tópicos do Lite em uma região. Esses tópicos podem ser regionais ou zonais do Lite. Usar reservas do Lite é uma opção melhor do que definir a capacidade de throughput de tópicos individuais do Lite. Com as reservas Lite, você gerencia e monitora menos recursos. Além disso, não é preciso escolher a capacidade de transferência de tópicos individuais do Lite.

Para usar uma reserva do Lite, anexe um tópico do Lite que esteja na mesma região à reserva específica do Lite. É possível anexar uma única reserva do Lite a tópicos do Lite zonais e regionais. Todas as partições em um tópico do Lite anexado a uma reserva do Lite consomem dinamicamente a capacidade de transferência provisionada na reserva do Lite. Se você especificar uma reserva do Lite para um tópico do Lite, também poderá incluir limites de taxa para limitar a capacidade de processamento de cada partição do tópico do Lite.

Visão geral das unidades de capacidade

A capacidade de uma reserva do Lite é provisionada em unidades de capacidade.

Uma unidade de capacidade corresponde ao seguinte throughput:

Tipo de tópico do Lite Capacidade de publicação em MiBps Capacidade de assinatura em MiBps
Zonal 1 2
Regional 0,25 0,5

Diretrizes para nomear uma reserva

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

projects/project-identifier/collection/ID

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

  • collection: precisa ser topics, subscriptions ou reservations.

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

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

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

Diretrizes para usar uma reserva do Lite

O provisionamento de throughput com reservas do Lite é obrigatório para tópicos regionais do Lite e opcional para tópicos zonais do Lite. Uma reserva do Lite é um recurso regional.

Tenha em mente o seguinte ao planejar a configuração de uma reserva Lite:

  • O número de unidades de capacidade necessárias para uma reserva do Lite precisa ser igual à taxa de transferência máxima esperada em qualquer minuto em todos os tópicos e assinaturas nessa reserva do Lite.

  • Quando a capacidade combinada de todos os tópicos do Lite em uma reserva do Lite atinge a capacidade, a publicação e a exibição são limitadas. Os servidores do Pub/Sub Lite param de enviar mensagens aos clientes, e as mensagens são armazenadas em buffer no cliente do editor. É possível configurar um alerta para reservation/throughput_capacity/utilization para saber quando a reserva estiver em risco de ser limitada e aumentar o tamanho dela.

  • É possível atualizar a taxa de transferência das reservas quantas vezes quiser. As mudanças entram em vigor em menos de um minuto. No entanto, se você diminuir a taxa de transferência de uma reserva, a cobrança pelo valor mais alto vai continuar sendo feita por um período de 24 horas. O Pub/Sub Lite é inerentemente um sistema de pagamento por capacidade, em que os aumentos de escala são instantâneos e as reduções são possíveis.

  • Todos os tópicos do Lite anexados a uma reserva do Lite consomem do mesmo pool de capacidade de transferência. Portanto, é possível que um tópico do Lite use repentinamente uma grande quantidade de capacidade de transferência, deixando outros tópicos do Lite sem recursos e impedindo que eles publiquem ou recebam mensagens. Se você precisar de isolamento total entre tópicos do Lite, anexe-os a reservas independentes.

Impacto das partições em uma reserva do Lite

O número total de partições em todos os tópicos do Lite em uma reserva do Lite não pode ser maior que o número de unidades de capacidade reservadas. Por exemplo, não é possível anexar uma reserva do Lite de 10 unidades de capacidade a um tópico do Lite ou a um conjunto de tópicos do Lite com um número total de partições maior que 10.

Calcular unidades de capacidade para uma reserva do Lite

O tamanho de uma reserva Lite é definido pelo número de unidades de capacidade. Os exemplos a seguir ilustram como estimar a capacidade necessária para tópicos Lite individuais.

  1. Determine o pico da capacidade de processamento de publicação.

    Estimar o pico na capacidade de todos os tópicos do Lite anexados à reserva do Lite. Uma estimativa aproximada para a taxa de transferência é suficiente, já que você sempre pode atualizar o tamanho da reserva.

  2. Determine o pico da capacidade de processamento de assinatura.

    O pico da capacidade de processamento de assinatura é calculado de maneira semelhante ao pico da capacidade de processamento de publicação. No entanto, considere que seus assinantes não precisam necessariamente receber mensagens na taxa máxima dos editores. Se os atrasos no processamento forem aceitáveis, o Pub/Sub Lite permite armazenar mensagens em buffer e processá-las a uma taxa constante. Ao mesmo tempo, é possível que você queira ter mais capacidade de inscrição do que de publicação para acomodar o tempo de inatividade ocasional dos assinantes.

  3. Determine o número total de unidades de capacidade necessárias.

    A tabela na seção anterior especifica o número de MiBps que uma unidade de capacidade pode acomodar para operações diferentes. Confira a fórmula abaixo para calcular as unidades de capacidade necessárias para uma reserva de amostra do Lite:

    • Pico da capacidade de processamento de publicação dos tópicos do Lite zonal = Pz MiBps
    • Pico da capacidade de processamento de publicação dos tópicos do Lite regional = Pr MiBps
    • Pico da capacidade de processamento de assinatura dos tópicos do Lite zonal = Sz MiBps
    • Pico da capacidade de processamento de assinatura dos tópicos regionais do Lite = Sr MiBps

      Número de unidades de capacidade necessárias = (Pz / 1 MiBps) + (Pr/0.25 MiBps) + (Sz/2 MiBps) + (Sr/0.5 MiBps)

      Se o número não for inteiro, você vai precisar arredondar o valor para cima.

Configurar a capacidade de transferência sem uma reserva do Lite

  • Capacidade de processamento de publicação do tópico: é possível especificar de 4 a 16 MiBps de capacidade de processamento, e o valor precisa ser um número inteiro.

  • Capacidade de assinatura de tópico: é possível especificar de 4 a 32 MiBps de capacidade, e o valor precisa ser um número inteiro.

Para a capacidade de assinatura, recomendamos que você provisione a capacidade de processamento para igualar o produto da capacidade de publicação esperada e o número de assinaturas no tópico.

A capacidade do editor e do assinante provisionada para um tópico individual não é intercambiável. Por esse motivo, recomendamos que você use sempre as reservas.

Há diferenças no faturamento ao provisionar a capacidade diretamente para tópicos em vez de usar reservas. Consulte a página de preços do Pub/Sub Lite para saber mais.

Criar uma reserva do Lite

Uma reserva do Lite precisa estar no mesmo projeto e região que todos os tópicos do Lite anexados. Para uma lista de zonas e regiões disponíveis, consulte Locais do Pub/Sub Lite.

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

Console

  1. Acesse a página Reservas do Lite.

    Acessar as Reservas do Lite

  2. Clique em Criar reserva do Lite.

  3. Selecione uma região.

  4. Insira um ID de reserva do Lite.

  5. Provisione a quantidade de unidades de capacidade.

  6. Clique em Criar.

gcloud

Para criar uma reserva do Lite, use o comando gcloud pubsub lite-reservations create:

gcloud pubsub lite-reservations create myRes \
  --location=us-central1 \
  --throughput-capacity=INTEGER_NUMBER_OF_UNITS
gcloud pubsub lite-topics create myTopic \
  --throughput-reservation=myRez \
  --zone=ZONE \
  --location=us-central1a \
  --partitions \
  --storage

Go

Antes de executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func createReservation(w io.Writer, projectID, region, reservationID string, throughputCapacity int) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// reservationID := "my-reservation"
	// throughputCapacity := 4
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	reservationPath := fmt.Sprintf("projects/%s/locations/%s/reservations/%s", projectID, region, reservationID)
	res, err := client.CreateReservation(ctx, pubsublite.ReservationConfig{
		Name:               reservationPath,
		ThroughputCapacity: throughputCapacity,
	})
	if err != nil {
		return fmt.Errorf("client.CreateReservation got err: %w", err)
	}
	fmt.Fprintf(w, "Created reservation: %s\n", res.Name)
	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.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.proto.Reservation;
import java.util.concurrent.ExecutionException;

public class CreateReservationExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    long projectNumber = Long.parseLong("123456789");
    String cloudRegion = "your-cloud-region";
    String reservationId = "your-reservation-id";
    // Each unit of throughput capacity supports up to 1 MiB/s of published messages or
    // 2 MiB/s of subscribed messages.
    int throughputCapacity = 4;

    createReservationExample(projectNumber, cloudRegion, reservationId, throughputCapacity);
  }

  public static void createReservationExample(
      long projectNumber, String cloudRegion, String reservationId, int throughputCapacity)
      throws Exception {

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    Reservation reservation =
        Reservation.newBuilder()
            .setName(reservationPath.toString())
            .setThroughputCapacity(throughputCapacity)
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Reservation response = adminClient.createReservation(reservation).get();
      System.out.println(response.getAllFields() + " created successfully.");
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (AlreadyExistsException alreadyExists) {
        System.out.println("This reservation 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, Reservation
from google.cloud.pubsublite.types import CloudRegion, ReservationPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# reservation_id = "your-reservation-id"
# Each unit of throughput capacity supports up to 1 MiB/s of published messages
# or 2 MiB/s of subscribed messages. Must be a positive integer.
# throughput_capacity = 4

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

reservation = Reservation(
    name=str(reservation_path),
    throughput_capacity=throughput_capacity,
)

client = AdminClient(cloud_region)
try:
    response = client.create_reservation(reservation)
    print(f"{response.name} created successfully.")
except AlreadyExists:
    print(f"{reservation_path} already exists.")

Atualizar uma reserva do Lite

É possível atualizar o número de unidades de capacidade configuradas para uma reserva Lite.

É possível atualizar uma reserva do Lite com o console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub Lite.

Console

  1. Acesse a página Reservas do Lite.

    Acessar as Reservas do Lite

  2. Clique no ID da reserva do Lite.

  3. Na página de detalhes da reserva do Lite, clique em Editar.

gcloud

Para atualizar uma reservado Lite, use o comando gcloud pubsub lite-reservations update:

gcloud pubsub lite-reservations update RESERVATION_ID \
  --location=REGION \
  --throughput-capacity=THROUGHPUT_CAPACITY

Substitua:

  • RESERVATION_ID: o ID da reserva do Lite
  • REGION: a região da reserva
  • THROUGHPUT_CAPACITY: a capacidade de transferência de reserva.

Go

Antes de executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func updateReservation(w io.Writer, projectID, region, reservationID string, throughputCapacity int) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// reservationID := "my-reservation-id"
	// throughputCapacity := 8
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	reservationPath := fmt.Sprintf("projects/%s/locations/%s/reservations/%s", projectID, region, reservationID)
	config := pubsublite.ReservationConfigToUpdate{
		Name:               reservationPath,
		ThroughputCapacity: throughputCapacity,
	}
	updatedCfg, err := client.UpdateReservation(ctx, config)
	if err != nil {
		return fmt.Errorf("client.UpdateReservation got err: %w", err)
	}
	fmt.Fprintf(w, "Updated reservation: %#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.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.proto.Reservation;
import java.util.concurrent.ExecutionException;

public class UpdateReservationExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    long projectNumber = Long.parseLong("123456789");
    String cloudRegion = "your-cloud-region";
    String reservationId = "your-reservation-id";
    // Each unit of throughput capacity supports up to 1 MiB/s of published messages or
    // 2 MiB/s of subscribed messages.
    int throughputCapacity = 8;

    updateReservationExample(projectNumber, cloudRegion, reservationId, throughputCapacity);
  }

  public static void updateReservationExample(
      long projectNumber, String cloudRegion, String reservationId, int throughputCapacity)
      throws Exception {

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    com.google.protobuf.FieldMask fieldMask =
        com.google.protobuf.FieldMask.newBuilder().addPaths("throughput_capacity").build();

    Reservation reservation =
        Reservation.newBuilder()
            .setName(reservationPath.toString())
            .setThroughputCapacity(throughputCapacity)
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Reservation reservationBeforeUpdate = adminClient.getReservation(reservationPath).get();
      System.out.println("Before update: " + reservationBeforeUpdate.getAllFields());

      Reservation reservationAfterUpdate =
          adminClient.updateReservation(reservation, fieldMask).get();
      System.out.println("After update: " + reservationAfterUpdate.getAllFields());
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This reservation 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, Reservation
from google.cloud.pubsublite.types import CloudRegion, ReservationPath
from google.protobuf.field_mask_pb2 import FieldMask

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# reservation_id = "your-reservation-id"
# Each unit of throughput capacity supports up to 1 MiB/s of published messages
# or 2 MiB/s of subscribed messages. Must be a positive integer.
# throughput_capacity = 8

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

# Defines which fields to update in the reservation.
field_mask = FieldMask(paths=["throughput_capacity"])

reservation = Reservation(
    name=str(reservation_path), throughput_capacity=throughput_capacity
)

client = AdminClient(cloud_region)
try:
    response = client.get_reservation(reservation_path)
    print(f"Before update: {response}")

    response = client.update_reservation(reservation, field_mask)
    print(f"After update: {response}")
except NotFound:
    print(f"{reservation_path} is not found.")

Acessar detalhes da reserva do Lite

Para mais detalhes sobre uma reserva do Lite, use o console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub Lite.

Console

  1. Acesse a página Reservas do Lite.

    Acessar as Reservas do Lite

  2. Clique no ID da reserva do Lite.

gcloud

Para ver detalhes sobre uma reserva do Lite, use o comando gcloud pubsub lite-reservations describe:

gcloud pubsub lite-reservations describe RESERVATION_ID \
  --location=REGION

Substitua:

  • RESERVATION_ID: o ID da reserva do Lite
  • REGION: a região da reserva

Go

Antes de executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func getReservation(w io.Writer, projectID, region, reservationID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// reservationID := "my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	reservationPath := fmt.Sprintf("projects/%s/locations/%s/reservations/%s", projectID, region, reservationID)
	res, err := client.Reservation(ctx, reservationPath)
	if err != nil {
		return fmt.Errorf("client.Reservation got err: %w", err)
	}
	fmt.Fprintf(w, "Got reservation: %#v\n", res)
	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.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import com.google.cloud.pubsublite.proto.Reservation;
import java.util.concurrent.ExecutionException;

public class GetReservationExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    long projectNumber = Long.parseLong("123456789");
    String cloudRegion = "your-cloud-region";
    String reservationId = "your-reservation-id";

    getReservationExample(projectNumber, cloudRegion, reservationId);
  }

  public static void getReservationExample(
      long projectNumber, String cloudRegion, String reservationId) throws Exception {
    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      Reservation response = adminClient.getReservation(reservationPath).get();
      long throughputCapacity = response.getThroughputCapacity();
      System.out.println(
          response.getAllFields()
              + "\nhas "
              + throughputCapacity
              + " units of throughput capacity.");
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This reservation 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, ReservationPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# reservation_id = "your-reservation-id"

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

client = AdminClient(cloud_region)
try:
    response = client.get_reservation(reservation_path)
    print(
        f"{response.name} has {response.throughput_capacity} units of throughput capacity."
    )
except NotFound:
    print(f"{reservation_path} is not found.")

Listar reservas do Lite

Console

gcloud

Para visualizar uma lista das reservas do Lite em um projeto, use o comando gcloud pubsub lite-reservations list:

gcloud pubsub lite-reservations list \
  --location=REGION

Substitua:

  • REGION: a região da reserva

Go

Antes de executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
	"google.golang.org/api/iterator"
)

func listReservations(w io.Writer, projectID, region string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	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, region)
	resIter := client.Reservations(ctx, parent)
	for {
		res, err := resIter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("resIter.Next() got err: %w", err)
		}
		fmt.Fprintf(w, "Got reservation config: %v", res)
	}
	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.LocationPath;
import com.google.cloud.pubsublite.ProjectNumber;
import com.google.cloud.pubsublite.proto.Reservation;
import java.util.List;

public class ListReservationsExample {

  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    long projectNumber = Long.parseLong("123456789");
    String cloudRegion = "your-cloud-region";

    listReservationsExample(projectNumber, cloudRegion);
  }

  public static void listReservationsExample(long projectNumber, String cloudRegion)
      throws Exception {

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    LocationPath locationPath =
        LocationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .build();

    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      List<Reservation> reservations = adminClient.listReservations(locationPath).get();
      for (Reservation reservation : reservations) {
        System.out.println(reservation.getAllFields());
      }
      System.out.println(reservations.size() + " reservation(s) listed in " + locationPath + ".");
    }
  }
}

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 LocationPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"

location_path = LocationPath(project_number, cloud_region)

client = AdminClient(cloud_region)
response = client.list_reservations(location_path)

for reservation in response:
    print(reservation)

print(f"{len(response)} reservation(s) listed in your project and location.")

Excluir uma reserva do Lite

É possível excluir reservas do Lite com o console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub Lite. Para excluir uma reserva, ela não pode conter nenhum tópico. É possível anexar tópicos atuais a uma reserva diferente e, em seguida, excluir a reserva.

Console

  1. Acesse a página Reservas do Lite.

    Acessar as Reservas do Lite

  2. Clique no ID da reserva do Lite.

  3. Na página de detalhes da reserva do Lite, clique em Excluir.

  4. Na caixa de diálogo exibida, clique em Excluir para confirmar a exclusão da reserva do Lite.

gcloud

Para excluir uma reserva do Lite, use o comando gcloud pubsub lite-reservations delete:

gcloud pubsub lite-reservations delete RESERVATION_ID \
  --location=REGION

Substitua:

  • RESERVATION_ID: o ID da reserva do Lite
  • REGION: a região da reserva

Go

Antes de executar este exemplo, siga as instruções de configuração do Go nas bibliotecas de cliente do Pub/Sub Lite.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsublite"
)

func deleteReservation(w io.Writer, projectID, region, reservationID string) error {
	// projectID := "my-project-id"
	// region := "us-central1"
	// reservationID := "my-reservation"
	ctx := context.Background()
	client, err := pubsublite.NewAdminClient(ctx, region)
	if err != nil {
		return fmt.Errorf("pubsublite.NewAdminClient: %w", err)
	}
	defer client.Close()

	reservationPath := fmt.Sprintf("projects/%s/locations/%s/reservations/%s", projectID, region, reservationID)
	err = client.DeleteReservation(ctx, reservationPath)
	if err != nil {
		return fmt.Errorf("client.DeleteReservation got err: %w", err)
	}
	fmt.Fprint(w, "Deleted reservation")
	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.ProjectNumber;
import com.google.cloud.pubsublite.ReservationName;
import com.google.cloud.pubsublite.ReservationPath;
import java.util.concurrent.ExecutionException;

public class DeleteReservationExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    long projectNumber = Long.parseLong("123456789");
    String cloudRegion = "your-cloud-region";
    String reservationId = "your-reservation-id";

    deleteReservationExample(projectNumber, cloudRegion, reservationId);
  }

  public static void deleteReservationExample(
      long projectNumber, String cloudRegion, String reservationId) throws Exception {

    ReservationPath reservationPath =
        ReservationPath.newBuilder()
            .setProject(ProjectNumber.of(projectNumber))
            .setLocation(CloudRegion.of(cloudRegion))
            .setName(ReservationName.of(reservationId))
            .build();

    AdminClientSettings adminClientSettings =
        AdminClientSettings.newBuilder().setRegion(CloudRegion.of(cloudRegion)).build();

    // If a reservation has topics attached, you must delete the topics before deleting
    // the reservation.
    try (AdminClient adminClient = AdminClient.create(adminClientSettings)) {
      adminClient.deleteReservation(reservationPath).get();
      System.out.println(reservationPath + " deleted successfully.");
    } catch (ExecutionException e) {
      try {
        throw e.getCause();
      } catch (NotFoundException notFound) {
        System.out.println("This reservation 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, ReservationPath

# TODO(developer):
# project_number = 1122334455
# cloud_region = "us-central1"
# reservation_id = "your-reservation-id"

cloud_region = CloudRegion(cloud_region)
reservation_path = ReservationPath(project_number, cloud_region, reservation_id)

client = AdminClient(cloud_region)
try:
    client.delete_reservation(reservation_path)
    print(f"{reservation_path} deleted successfully.")
except NotFound:
    print(f"{reservation_path} not found.")

A seguir