Criar e gerenciar reservas do Lite

Neste documento, explicamos como usar e gerenciar as reservas do Pub/Sub Lite. Neste documento, também explicamos o conceito de unidades de capacidade e como determinar quantas são necessárias para acomodar a capacidade do seu aplicativo.

Visão geral das reservas do Lite

As reservas do Lite provisionam e compartilham dinamicamente a capacidade de capacidade entre um ou vários tópicos do Lite em uma região. Eles podem ser regionais ou zonais. Usar reservas do Lite é uma opção melhor do que configurar a capacidade de capacidade de tópicos individuais do Lite. Com as reservas do Lite, você gerencia e monitora menos recursos. Além disso, não é necessário escolher a capacidade 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 zonais e regionais do Lite. Todas as partições em um tópico do Lite anexado a uma reserva do Lite consomem dinamicamente a capacidade provisionada na reserva do Lite. Se você especificar uma reserva do Lite para um tópico do Lite, também será possível incluir limites de taxa para limitar a capacidade de cada partição do tópico do Lite.

Visão geral das unidades de capacidade

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

Uma unidade de capacidade corresponde à seguinte capacidade:

Tipo de tópico do Lite Capacidade de publicação em MiBps Capacidade de assinatura em MiBps
Por zona 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 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.

Diretrizes para usar uma reserva do Lite

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

Considere o seguinte ao planejar configurar uma reserva do Lite:

  • O número de unidades de capacidade necessárias para uma reserva do Lite precisa ser igual à capacidade de pico esperada em qualquer minuto em todos os tópicos e assinaturas dessa 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 editor. É possível configurar um alerta para reservation/throughput_capacity/utilization para informar quando a reserva estiver em risco de ser limitada e aumentar o tamanho dela.

  • É possível atualizar a capacidade de processamento das reservas quantas vezes quiser. As alterações entram em vigor em menos de um minuto. No entanto, se você diminuir a capacidade de uma reserva, continuará sendo cobrado pelo valor mais alto por um período de 24 horas. O Pub/Sub Lite é inerentemente um sistema de pagamento pela capacidade, em que os aumentos 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 o mesmo pool de capacidade de capacidade. Portanto, é possível que um tópico do Lite use de repente uma grande quantidade de capacidade de processamento, impedindo outros tópicos do Lite e impedindo que eles publiquem ou recebam mensagens. Se você precisar do isolamento total entre os tópicos do Lite, anexe-os às 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 número total de partições maior que 10.

Calcular as unidades de capacidade de uma reserva do Lite

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

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

    Estime o pico na capacidade de processamento de todos os tópicos do Lite anexados à reserva do Lite. Uma estimativa aproximada da capacidade é suficiente porque é possível atualizar o tamanho da reserva a qualquer momento.

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

    O pico da capacidade de processamento de assinatura é calculado de maneira semelhante à capacidade de publicação de pico. No entanto, considere que seus assinantes não precisam necessariamente receber mensagens na taxa de pico dos editores. Se atrasos no processamento forem aceitáveis, o Pub/Sub Lite permitirá que você armazene mensagens em buffer e processe-as em uma taxa estável. Ao mesmo tempo, talvez você queira ter mais capacidade de assinatura do que de publicação para acomodar a 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 diferentes operações. Veja a seguir a fórmula para calcular as unidades de capacidade necessárias para uma amostra de reserva do Lite:

    • Pico da capacidade de processamento de publicação dos tópicos zonais do Lite = Pz MiBps
    • Capacidade de publicação máxima dos tópicos regionais do Lite = Pr MiBps
    • Capacidade máxima de assinatura dos tópicos zonais do Lite = Sz MiBps
    • Capacidade máxima 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, arredonde o valor.

Configure a capacidade de processamento sem uma reserva do Lite

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

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

Para a capacidade de processamento de assinatura, recomendamos que você provisione sua capacidade de forma que ela seja igual ao produto da capacidade de publicação esperada e ao número de assinaturas no seu 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 mais detalhes.

Criar uma reserva do Lite

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

É possível criar uma reserva do Lite usando 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 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 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 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.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 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, 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 do 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 capacidade da reserva.

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 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 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.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 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, 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.")

Ver detalhes da reserva do Lite

É possível receber detalhes sobre uma reserva do Lite usando 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 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 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 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.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 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, 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 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 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 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.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 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 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 as reservas do Lite usando o console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub Lite. Para excluir uma reserva, ela não pode conter tópicos. É 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 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 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 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.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 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, 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