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 manière dont ils répliquent les données. Toutes les autres propriétés de sujet sont identiques à celles décrites dans une section ultérieure de ce document.

Réplication des 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 la disponibilité de ses composants sous-jacents, qui incluent à la fois le frontend de l'application et le stockage.

La disponibilité d'un sujet zonal Pub/Sub Lite dépend de la disponibilité à la fois du frontend de l'application et du stockage dans sa zone configurée. Si le frontend de l'application ou le stockage rencontre un échec zonal, le sujet Lite zonal devient indisponible pendant toute la durée de l'indisponibilité.

La disponibilité d'un sujet régional Pub/Sub Lite dépend de la disponibilité du frontend de l'application et du stockage dans la région configurée. Les types de défaillances suivants sont possibles:

  • Si le stockage ou le frontend de l'application fait l'objet d'une défaillance zonale, le sujet Lite régional reste disponible.

  • Si le frontend de l'application et le stockage font l'objet d'une défaillance zonale, le sujet Lite régional reste disponible tant que les deux composants ne commencent pas à échouer en même temps.

  • Si le frontend de l'application et le stockage échouent simultanément, le sujet Lite régional reste indisponible pendant toute la durée de l'indisponibilité. Pendant cette période, les clients peuvent ne pas réussir à publier ni à consommer des messages, mais les messages sont toujours distribués dans l'ordre correct.

Un sujet Lite régional protège contre la plupart des types de défaillances à zone unique. 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 comporter 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 (Mio/s) Taux maximal auquel vous pouvez publier des messages.

    • Débit en abonnement (Mio/s) Débit maximal auquel les messages sont transférés vers les abonnements Lite.

    • Espace de stockage (Gio). Taille maximale des messages dans la partition. La capacité configurable minimale 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 est 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 de publication et d'abonnement de toutes les partitions du sujet Lite. Même si un sujet peut, au total, prendre en charge 1 Gibit/s de débit de publication, c'est la limite de publication par partition qui limite effectivement le débit.

  • Limite du client abonné et des abonnements. Pub/Sub Lite prend en charge un seul client abonné pour une seule partition et un seul abonnement. Par exemple, un abonnement à un sujet comportant cinq partitions peut avoir au maximum cinq clients abonnés qui consomment des messages à partir de celui-ci. Si davantage de clients abonnés sont configurés, les clients en trop restent inactifs. Le même sujet avec deux abonnements peut comporter jusqu'à 10 clients abonnés, cinq clients pour chaque 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 les sujets Lite régionaux et 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 de publication et d'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 Configurer la capacité de débit sans réservations.

  • Configuration de l'espace de stockage. Pour configurer le stockage, vous devez spécifier 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 des messages. Si vous ne spécifiez pas de durée de conservation des messages, le sujet Lite stocke les messages 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 correspond à 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, afin de créer plus de capacité de stockage, les messages les plus anciens de la partition sont supprimés. La suppression des messages les plus anciens se produit même si les messages sont dans la période de conservation. Le service ne supprime jamais les messages avant l'expiration de leur TTL, sauf si leur suppression est nécessaire pour libérer de l'espace pour les messages nouvellement publiés. Pour en savoir plus sur le lien entre la capacité et la tarification, consultez la page Tarifs de Pub/Sub Lite.

Consignes de dénomination d'un sujet

Un nom attribué à une ressource Pub/Sub Lite, comme un sujet, un abonnement ou une réservation, permet d'identifier cette ressource de manière unique. 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 de 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 être défini sur topics, subscriptions ou reservations.

  • ID: doit respecter les consignes 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 pourcentage % ;

    Vous pouvez utiliser les caractères spéciaux de la liste précédente dans les noms de ressources sans codage d'URL. Toutefois, vous devez vous assurer que tous les autres caractères spéciaux sont correctement encodés ou décodés lorsque vous les utilisez dans des URL. Par exemple, mi-tópico n'est pas un ID valide. En revanche, mi-t%C3%B3pico est une valeur 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 de n'importe quel sujet Lite zonal sur une valeur définie par les limites suivantes:

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

  • Débit en abonnement compris entre 4 et 32 Mio/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, à condition que la capacité totale de la réservation ne soit pas dépassée. Vous pouvez éventuellement définir une limite inférieure au débit réel par partition pour rendre votre trafic plus prévisible.

Vous pouvez augmenter le nombre de partitions d'un sujet pour l'adapter horizontalement. Le nombre de partitions d'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 associés à une même clé qui sont publiés après la mise à jour du nombre de partitions seront probablement mappés sur une partition différente de celles publiées avant la mise à jour.

En outre, la propagation du redimensionnement du sujet auprès de tous les éditeurs peut prendre quelques secondes. Il est possible que certains de ces éditeurs utilisent la nouvelle fonction de hachage pendant un court laps de temps alors que d'autres continuent d'utiliser l'ancienne.

Augmenter la capacité de stockage d'un sujet Lite

Vous pouvez augmenter ou diminuer l'espace de stockage dans 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, la Google Cloud CLI ou l'API Pub/Sub Lite.

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

Console

  1. Accédez à la page Sujets Lite.

    Accéder aux 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 cette région.

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

    Vous ne pouvez pas modifier l'emplacement d'un sujet après sa création.

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

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

  4. Dans la section Débit:

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

      Cette option est facultative 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. Saisissez l'espace de stockage par partition.

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

  6. Vérifiez les modifications apportées, 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 l'élément suivant :

  • 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, par exemple 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 l'élément suivant :

  • 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 correspondant à la capacité de débit de publication de chaque partition

  • subscribe_CAPACITY: entier correspondant à la capacité de débit d'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, par exemple 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 adapter le débit et la capacité de stockage par partition. Vous pouvez également augmenter, mais pas diminuer le nombre de partitions.

Mettre à jour un sujet Lite

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

  • Réservation associée au sujet Lite

  • Nombre de partitions dans le sujet (vous ne pouvez l'augmenter que)

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

  • Stockage par partition

  • Type de conservation des messages

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

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

Console

  1. Accédez à la page Sujets Lite.

    Accéder aux sujets Lite

  2. Cliquez sur l'ID de sujet Lite.

  3. Cliquez sur Modifier.

  4. Vous pouvez effectuer l'une ou l'ensemble des modifications suivantes:

    • Utiliser 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 de publication et d'abonnement maximal autorisé.
    • Pour les sujets zonaux, mettez à jour le débit de publication et d'abonnement réservé. Pour les sujets associés à une réservation, 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 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 l'élément suivant :

  • 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 correspondant à la capacité de débit de publication de chaque partition

  • subscribe_CAPACITY: entier correspondant à la capacité de débit d'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 correspondant à la capacité de débit de publication de chaque partition

  • subscribe_CAPACITY: entier correspondant à la capacité de débit d'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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 détails sur un sujet Lite à l'aide de la console Google Cloud, de la Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder aux 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 l'élément suivant :

  • 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 des 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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, du Google Cloud CLI ou de l'API Pub/Sub Lite.

Console

  1. Accédez à la page Sujets Lite.

    Accéder aux 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 l'élément suivant :

    • 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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 dans la section Bibliothèques clientes de 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