Créer et gérer des sujets Lite

Ce document explique comment créer, afficher et supprimer un sujet Pub/Sub Lite.

Présentation d'un sujet Lite

Un service Pub/Sub Lite nécessite un sujet auquel les éditeurs peuvent envoyer des messages afin que les abonnés puissent les recevoir. Dans Pub/Sub Lite, vous pouvez choisir de créer un sujet Lite zonal ou régional.

Un sujet Lite zonal et un sujet Lite régional ne diffèrent que par la façon dont ils répliquent les données. Toutes les autres propriétés de la rubrique sont identiques à celles décrites dans une section ultérieure de ce document.

Réplication de données dans un sujet Lite

Les sujets régionaux Pub/Sub Lite stockent les données dans deux zones d'une même région. Les sujets zonaux Pub/Sub Lite répliquent les données dans une seule zone. Pub/Sub Lite réplique les données de manière asynchrone.

La disponibilité de Pub/Sub Lite dépend de celle de ses composants sous-jacents, qui incluent à la fois l'interface et l'espace de stockage de l'application.

La disponibilité d'un sujet Pub/Sub Lite zonal dépend de la disponibilité de l'interface de l'application et de l'espace de stockage dans sa zone configurée. En cas de défaillance de l'interface ou de l'espace de stockage de l'application, le sujet Lite zonal devient indisponible pendant toute la durée de la panne.

La disponibilité d'un sujet régional Pub/Sub Lite dépend de la disponibilité de l'interface et de l'espace de stockage de l'application dans la région configurée. Voici les types de défaillances possibles:

  • Si l'interface de l'application ou le stockage rencontre une défaillance de zone, le sujet Lite régional reste disponible.

  • Si l'interface de l'application et l'espace de stockage rencontrent une défaillance de zone, le sujet Lite régional reste disponible tant que les deux composants ne commencent pas à tomber en panne en même temps.

  • Si l'interface de l'application et le stockage échouent simultanément, le sujet Lite régional reste indisponible pendant toute la durée de la panne. Pendant ce temps, les clients peuvent ne pas publier ou consommer les messages, mais ceux-ci sont toujours distribués dans le bon ordre.

Un sujet Lite régional offre une protection contre la plupart des types de défaillances dans une seule zone. Toutefois, dans de rares cas, la nature asynchrone de la réplication peut entraîner une défaillance simultanée de plusieurs composants dans une même zone. Par conséquent, un sujet Lite régional devient indisponible.

Propriétés d'un sujet Lite

Les sujets Lite ont les propriétés suivantes:

  • Nombre de partitions. Une partition est l'unité de base pour le parallélisme dans Pub/Sub Lite. Un sujet Lite peut avoir une ou plusieurs partitions.

  • Capacité d'une partition. La capacité d'une partition est décrite par les trois propriétés suivantes:

    • Débit en publication (Mbit/s). Fréquence maximale à laquelle vous pouvez publier des messages.

    • Débit en abonnement (Mbit/s). Fréquence maximale de transfert des messages vers les abonnements Lite.

    • Stockage (Gio). Taille maximale des messages dans la partition. La capacité minimale configurable d'une partition est de 30 Gio.

  • Capacité de stockage d'un sujet Lite. Toutes les partitions d'un sujet Lite ont la même capacité de stockage configurée. La capacité de stockage totale d'un sujet Lite correspond à la somme de la capacité de stockage de toutes les partitions du sujet. Par exemple, si un sujet Lite comporte huit partitions et que chacune d'elles a une taille de 30 Gio, la capacité de stockage totale du sujet Lite est de 240 Gio (8 x 30).

  • Capacité de débit d'un sujet Lite. La capacité de débit correspond à la capacité de débit totale en publication et en abonnement de toutes les partitions du sujet Lite. Même si l'un de vos sujets accepte globalement 1 Gbit/s de débit en publication, c'est la limite de publication par partition qui limite efficacement le débit.

  • Limite applicable au client abonné et aux abonnements. Pub/Sub Lite n'accepte qu'un seul client abonné pour une seule partition et un seul abonnement. Par exemple, un abonnement à un sujet avec cinq partitions peut comporter au maximum cinq clients abonnés qui consomment des messages depuis celui-ci. Si d'autres clients abonnés sont configurés, les clients en excès restent inactifs. Le même sujet avec deux abonnements peut comporter jusqu'à 10 clients abonnés, soit cinq clients par abonnement.

  • Réservations. Une réservation est le moyen le plus simple de provisionner et de gérer la capacité de débit pour un certain nombre de sujets. Le provisionnement de la capacité de débit avec des réservations est obligatoire pour l'édition Lite régionale et est facultatif pour les sujets Lite zonaux.

    Si vous n'utilisez pas de réservations pour un sujet Lite zonal, vous devez explicitement provisionner la capacité de débit en publication et en abonnement du sujet. Sans réservation, toutes les partitions d'un sujet Lite ont la même capacité de débit configurée. Pour en savoir plus, consultez la section Configurer la capacité de débit sans réservations.

  • Configuration du stockage. Pour configurer le stockage, vous devez spécifier à la fois la capacité de stockage et, éventuellement, la durée de conservation des messages.

    • Durée de conservation des messages. Durée maximale pendant laquelle un sujet Lite stocke les messages. Si vous ne spécifiez pas de durée de conservation des messages, le sujet Lite les stocke jusqu'à ce que vous dépassiez la capacité de stockage.

    • Capacité de stockage. La capacité du sujet Pub/Sub Lite est déterminée par le nombre de partitions du sujet et la capacité de stockage de chaque partition. Le stockage par partition est la quantité d'espace de stockage, en octets, pour chaque partition. Notez que les sujets Lite régionaux utilisent deux octets de capacité de stockage pour chaque octet publié. Les sujets Lite zonaux utilisent un octet de capacité de stockage pour chaque octet publié.

    Si vous dépassez la capacité de stockage, le service Pub/Sub Lite continue de publier des messages. Toutefois, pour augmenter la capacité de stockage, les messages les plus anciens de la partition sont supprimés. Les messages les plus anciens sont supprimés même s'ils se trouvent dans la période de conservation des messages. Le service ne supprime jamais de messages avant l'expiration de leur valeur TTL, sauf si leur suppression est nécessaire pour faire de la place aux messages nouvellement publiés. Pour en savoir plus sur le lien entre la capacité et la tarification, consultez la section Tarifs de Pub/Sub Lite.

Consignes pour nommer un sujet

Un nom de ressource Pub/Sub Lite identifie de manière unique une ressource Pub/Sub Lite, telle qu'un sujet, un abonnement ou une réservation. Le nom de la ressource doit respecter le format suivant:

projects/project-identifier/collection/ID

  • project-identifier: doit correspondre à l'ID ou au numéro du projet, disponible dans la console Google Cloud. Par exemple, my-cool-project est un ID de projet. 123456789123 est un numéro de projet.

  • collection: doit correspondre à topics, subscriptions ou reservations.

  • ID: doit respecter les directives suivantes:

    • Ne pas commencer par la chaîne goog
    • Commencer par une lettre
    • contenir entre 3 et 255 caractères ;
    • Ne contenir que les caractères suivants: lettres [A-Za-z], chiffres [0-9], tirets -, traits de soulignement _, points ., tildes ~, signes plus + et signes de pourcentage %

    Vous pouvez utiliser les caractères spéciaux de la liste précédente dans les noms de ressources sans encodage URL. Lorsque vous utilisez des caractères spéciaux dans vos URL, assurez-vous toutefois que tous les autres caractères spéciaux sont correctement encodés ou décodés. Par exemple, mi-tópico n'est pas un identifiant valide. Toutefois, mi-t%C3%B3pico est valide. Ce format est important lorsque vous effectuez des appels REST.

Augmenter la capacité de débit d'un sujet Lite

Si vous n'utilisez pas de réservations Lite, vous pouvez définir la capacité de débit de chaque partition d'un sujet Lite zonal sur une valeur définie selon les limites suivantes:

  • Débit en publication compris entre 4 et 16 Mbit/s

  • Débit en abonnement compris entre 4 et 32 Mbit/s

Ces limites s'appliquent également aux partitions associées à une réservation Lite. Avec les réservations, chaque partition peut consommer n'importe quelle capacité de débit dans les limites spécifiées, tant que la capacité totale de la réservation n'est pas dépassée. Vous pouvez éventuellement définir une limite inférieure du débit réel par partition afin de rendre votre trafic plus prévisible.

Vous pouvez augmenter le nombre de partitions d'un sujet pour effectuer un scaling horizontal. Le nombre de partitions dans un sujet ne peut pas être réduit.

Lorsque vous modifiez le nombre de partitions, l'ordre relatif des messages n'est pas conservé. En interne, les messages sont attribués à des partitions à l'aide d'une fonction de hachage. La mise à jour du nombre de partitions dans un sujet modifie cette fonction de hachage. Les messages avec la même clé publiés après la mise à jour du nombre de partitions sont susceptibles d'être mappés sur une partition différente de celles publiées avant la mise à jour.

De plus, le redimensionnement du sujet prend quelques secondes pour se propager à tous les éditeurs. Il y a peu de temps, alors que certains éditeurs utilisent la nouvelle fonction de hachage et d'autres encore l'ancienne.

Augmenter la capacité de stockage d'un sujet Lite

Vous pouvez augmenter ou réduire l'espace de stockage d'un sujet Lite. Le sujet Lite provisionne la même quantité d'espace de stockage sur chaque partition. Si vous augmentez le stockage à 60 Gio, chacune des partitions dispose de 60 Gio d'espace de stockage.

Si vous réduisez la quantité de stockage dans un sujet Lite, le service Pub/Sub Lite supprime d'abord les messages les plus anciens.

Pour en savoir plus sur le lien entre la capacité et la tarification, consultez la page Tarifs de Pub/Sub Lite.

Créer un sujet Lite

Vous pouvez créer des sujets Lite avec la console Google Cloud, Google Cloud CLI ou l'API Pub/Sub Lite.

Pour obtenir la liste des régions et des zones disponibles, consultez la page Emplacements Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder à Sujets Lite

  2. Cliquez sur Créer un sujet Lite.

    1. Pour créer un sujet Lite zonal, sélectionnez une région et une zone dans la région.

    2. Pour créer un sujet Lite régional, sélectionnez une région.

    Vous ne pouvez pas mettre à jour l'emplacement après la création d'un sujet.

  3. Dans la section Nom, saisissez un ID de sujet Lite.

    Le nom du sujet Lite inclut son ID, son emplacement et le numéro de projet.

  4. Dans la section Débit:

    1. Sélectionnez ou créez une réservation.

      Ceci est facultatif pour un sujet Lite zonal et obligatoire pour un sujet Lite régional.

    2. Indiquez le débit maximal en publication et le débit maximal en abonnement.

      Un certain nombre de partitions sont définies automatiquement en fonction de vos entrées. Vous pouvez modifier ce nombre après avoir enregistré le sujet.

  5. Dans la section Stockage des messages:

    1. Indiquez l'espace de stockage par partition.

    2. Sélectionnez l'une des deux options de durée de conservation des messages.

  6. Examinez les modifications, puis cliquez sur Créer.

gcloud

Pour créer un sujet Lite, utilisez la commande 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]

Remplacez les éléments suivants :

  • TOPIC_ID: ID du sujet Lite

  • LOCATION : nom d'un emplacement compatible avec Pub/Sub Lite

  • NUMBER_OF_PARTITIONS: un entier représentant le nombre de partitions dans le sujet Lite

  • STORAGE_PER_PARTITION : quantité de stockage pour chaque partition, par exemple 30GiB

  • RESERVATION_NAME: chemin d'accès complet d'une réservation Lite tel que projects/123456789/locations/us-west1/reservations/my-reservation

  • MESSAGE_RETENTION_PERIOD : durée pendant laquelle le sujet Lite stocke des messages, tels que 1d ou 2w.

Si la requête aboutit, la ligne de commande affiche une confirmation :

Created [TOPIC_ID].

Protocole

Pour créer un sujet Lite, envoyez une requête POST comme suit :

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

Remplacez les éléments suivants :

Spécifiez les champs suivants dans le corps de la requête :

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

Remplacez les éléments suivants :

  • NUMBER_OF_PARTITIONS: un entier représentant le nombre de partitions dans le sujet Lite

  • STORAGE_PER_PARTITION : quantité de stockage pour chaque partition, par exemple 30GiB

  • publish_CAPACITY: entier pour la capacité de débit en publication de chaque partition.

  • subscribe_CAPACITY: nombre entier pour la capacité de débit en abonnement de chaque partition.

  • MESSAGE_RETENTION_PERIOD : durée pendant laquelle le sujet Lite stocke des messages, tels que 1d ou 2w.

  • RESERVATION_NAME: chemin d'accès complet d'une réservation Lite tel que projects/123456789/locations/us-west1/reservations/my-reservation

Si la requête aboutit, la réponse est le sujet Lite au format 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Go décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Java décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Python décrites dans les bibliothèques clientes 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.")

Après avoir créé le sujet Lite, vous pouvez faire évoluer le débit et la capacité de stockage par partition. Vous pouvez également augmenter le nombre de partitions, mais pas le réduire.

Mettre à jour un sujet Lite

Vous pouvez mettre à jour les propriétés suivantes d'un sujet Lite:

  • La réservation associée au sujet Lite

  • Nombre de partitions dans le sujet (il n'est pas possible d'augmenter le nombre de partitions)

  • Limites de capacité de débit en publication et en abonnement

  • Espace de stockage par partition

  • Type de conservation des messages

Avant de faire évoluer la capacité de débit ou de stockage d'un sujet, consultez les sections Ajuster la capacité de débit et Ajuster la capacité de stockage.

Vous pouvez mettre à jour un sujet Lite à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder à Sujets Lite

  2. Cliquez sur l'ID de sujet Lite.

  3. Cliquez sur Modifier.

  4. Vous pouvez effectuer toutes les modifications suivantes:

    • Utilisez une autre réservation. Pour les sujets zonaux, vous pouvez choisir de ne pas utiliser de réservation.
    • Saisissez le nombre de partitions. Cette valeur peut être augmentée, mais pas diminuée.
    • Activez ou désactivez le débit maximal autorisé en publication et en abonnement.
    • Pour les sujets zonaux, mettez à jour le débit de publication et d'abonnement réservé. Pour les sujets auxquels une réservation est associée, le débit mis à jour reflète la nouvelle limite maximale.
    • Modifiez la capacité de stockage par partition.
    • Modifiez la durée de conservation des messages.
  5. Cliquez sur Update (Mettre à jour).

gcloud

Pour mettre à jour un sujet Lite, utilisez la commande 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

Remplacez les éléments suivants :

  • TOPIC_ID: ID du sujet Lite

  • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

  • NUMBER_OF_PARTITIONS : nombre de partitions à configurer pour le sujet Lite.

  • publish_CAPACITY: entier pour la capacité de débit en publication de chaque partition.

  • subscribe_CAPACITY: nombre entier pour la capacité de débit en abonnement de chaque partition.

  • STORAGE_PER_PARTITION : quantité de stockage pour chaque partition, par exemple 30GiB

  • MESSAGE_RETENTION_PERIOD : durée pendant laquelle le sujet Lite stocke des messages, tels que 1d ou 2w.

Si la requête aboutit, la ligne de commande affiche le sujet 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

Protocole

Pour mettre à jour un sujet Lite, envoyez une requête PATCH comme suit:

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)

Remplacez les éléments suivants :

  • REGION : région dans laquelle se trouve le sujet Lite

  • PROJECT_NUMBER : numéro du projet contenant le sujet Lite

  • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

  • TOPIC_ID: ID du sujet Lite

Spécifiez les champs suivants dans le corps de la requête :

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

Remplacez les éléments suivants :

  • publish_CAPACITY: entier pour la capacité de débit en publication de chaque partition.

  • subscribe_CAPACITY: nombre entier pour la capacité de débit en abonnement de chaque partition.

  • STORAGE_PER_PARTITION : quantité de stockage pour chaque partition, par exemple 30GiB

  • MESSAGE_RETENTION_PERIOD : durée pendant laquelle le sujet Lite stocke des messages, tels que 1d ou 2w.

  • NUMBER_OF_PARTITIONS : nombre de partitions à configurer pour le sujet Lite.

Si la requête aboutit, la réponse est le sujet Lite au format 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Go décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Java décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Python décrites dans les bibliothèques clientes 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.")

Afficher les détails du sujet Lite

Vous pouvez obtenir des informations sur un sujet Lite à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder à Sujets Lite

  2. Cliquez sur l'ID de sujet Lite.

gcloud

Pour obtenir des détails sur un sujet Lite, utilisez la commande gcloud pubsub lite-topics describe :

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

Remplacez les éléments suivants :

  • TOPIC_ID: ID du sujet Lite

  • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

Si la requête aboutit, la ligne de commande affiche le sujet 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

Protocole

Pour obtenir des détails sur un sujet Lite, envoyez une requête GET comme suit:

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

Remplacez les éléments suivants :

  • REGION : région dans laquelle se trouve le sujet Lite

  • PROJECT_NUMBER : numéro du projet contenant le sujet Lite

  • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

  • TOPIC_ID: ID du sujet Lite

Si la requête aboutit, la réponse est le sujet Lite au format 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Go décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Java décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Python décrites dans les bibliothèques clientes 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.")

Répertorier les sujets Lite

Vous pouvez répertorier les sujets Lite dans un projet à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

gcloud

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

Remplacez LOCATION par le nom de l'emplacement dans lequel se trouve le sujet Lite.

Si la requête aboutit, la ligne de commande affiche les sujets 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

Protocole

Pour répertorier les sujets Lite d'un projet, envoyez une requête GET comme suit:

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

Remplacez les éléments suivants :

  • REGION : région dans laquelle se trouve le sujet Lite

  • PROJECT_NUMBER: numéro du projet contenant le sujet Lite

Si la requête aboutit, la réponse est une liste de sujets Lite au format JSON :

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

Go

Avant d'exécuter cet exemple, suivez les instructions de configuration de Go décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Java décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Python décrites dans les bibliothèques clientes 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.")

Supprimer un sujet Lite

Vous pouvez supprimer des sujets Lite à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder à Sujets Lite

  2. Cliquez sur l'ID de sujet Lite.

  3. Sur la page Détails du sujet Lite, cliquez sur Supprimer.

  4. Dans le champ qui s'affiche, saisissez delete pour confirmer la suppression du sujet Lite.

  5. Cliquez sur Supprimer.

gcloud

Pour supprimer un sujet Lite, utilisez la commande gcloud pubsub lite-topics delete :

  1. Exécutez la commande delete :

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

    Remplacez les éléments suivants :

    • TOPIC_ID: ID du sujet Lite

    • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

  2. Pour confirmer, saisissez Y.

Si la requête aboutit, la réponse est la suivante :

Deleted topic [TOPIC_ID].

Protocole

Pour supprimer un sujet Lite, envoyez une requête DELETE comme suit :

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

Remplacez les éléments suivants :

  • REGION : région dans laquelle se trouve le sujet Lite

  • PROJECT_NUMBER : numéro du projet contenant le sujet Lite

  • LOCATION : nom de l'emplacement dans lequel se trouve le sujet Lite.

  • TOPIC_ID: ID du sujet Lite

Si la requête aboutit, la réponse est un objet JSON vide.

Go

Avant d'exécuter cet exemple, suivez les instructions de configuration de Go décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Java décrites dans les bibliothèques clientes 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

Avant d'exécuter cet exemple, suivez les instructions de configuration de Python décrites dans les bibliothèques clientes 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.")

Si vous supprimez un sujet Lite, vous ne pouvez plus publier de messages dessus. Les abonnements au sujet Lite existent toujours, mais vous ne pouvez pas recevoir de messages provenant de ces abonnements Lite.

Étape suivante