Crear y usar temas

En este documento, se explica cómo crear, actualizar, ver y borrar un tema de Pub/Sub. En este documento, también se explica cómo nombrar temas y suscripciones.

Replicación de datos en un tema

Un tema de Pub/Sub usa tres zonas para almacenar datos. El servicio garantiza la replicación síncrona en al menos dos zonas y la mejor replicación en una tercera zona adicional. La replicación de Pub/Sub está dentro de una sola región.

Propiedades de un tema

Cuando creas o actualizas un tema, debes especificar sus propiedades.

  • Agrega una suscripción predeterminada. Agrega una suscripción predeterminada al tema de Pub/Sub. Puedes crear otra suscripción para el tema después de que se cree. La suscripción predeterminada tiene las siguientes propiedades:

    • ID de suscripción de -sub
    • Tipo de entrega de extracción
    • Duración de retención de mensajes de siete días
    • Vencimiento tras 31 días de inactividad
    • Plazo límite de confirmación de 10 segundos
    • Política de reintento inmediato
  • Esquema Un esquema es un formato que debe seguir el campo de datos del mensaje. Un esquema es un contrato entre el publicador y el suscriptor que Pub/Sub aplica. Los esquemas de tema ayudan a estandarizar los tipos de mensajes y permisos para permitir que los diferentes equipos de tu organización los consuman. Pub/Sub crea una autoridad central para los tipos de mensajes y los permisos. Para crear un tema con esquema, consulta Crea y administra esquemas.

  • Duración de la retención de mensajes. Especifica por cuánto tiempo el tema de Pub/Sub retiene mensajes después de la publicación. Una vez que finaliza la duración de retención de mensajes, Pub/Sub puede descartar el mensaje, independientemente de su estado de confirmación. Las tarifas de almacenamiento de mensajes se cobran por almacenar todos los mensajes publicados en el tema.

    • Predeterminado = No habilitado
    • Valor mínimo = 10 minutos
    • Valor máximo = 31 días
  • Usa una clave de encriptación administrada por el cliente (CMEK). Especifica si el tema se encripta con una CMEK. Pub/Sub encripta los mensajes con claves administradas por Google de forma predeterminada. Si especificas esta opción, Pub/Sub usa el patrón de encriptación de sobre con CMEK. En este enfoque, Cloud KMS no encripta los mensajes. En su lugar, Cloud KMS encripta las claves de encriptación de datos (DEK) que Pub/Sub crea para cada tema. Pub/Sub encripta los mensajes mediante la DEK más reciente que se generó para el tema. Pub/Sub desencripta los mensajes poco antes de que se entreguen a los suscriptores. Para obtener más información sobre cómo crear una clave, consulta Configura la encriptación de mensajes.

Lineamientos para asignar nombres a temas, suscripciones o instantáneas

Un nombre de recurso de Pub/Sub identifica de forma única un recurso de Pub/Sub, como un tema, una suscripción o una instantánea. El nombre del recurso debe ajustarse al siguiente formato:

projects/project-identifier/collection/ID

  • project-identifier: Debe ser el ID del proyecto, disponible en Google Cloud Console. Por ejemplo, my-cool-project

  • collection: Debe ser topics, subscriptions o snapshots.

  • ID: Debe cumplir con los siguientes lineamientos:

    • No debe comenzar con la string goog
    • Comenzar con una letra
    • tener entre 3 y 255 caracteres
    • Contiene solo los siguientes caracteres: letras [A-Za-z], números [0-9], guiones -, guiones bajos _, puntos ., virgulillas ~, signos más + y signos de porcentaje. %

    Puedes usar los caracteres especiales de la lista anterior en nombres de recursos sin codificación de URL. Sin embargo, debe asegurarse de que los demás caracteres especiales estén codificados o decodificados de forma correcta cuando los utilice en las URL. Por ejemplo, mi-tópico es un ID no válido. Sin embargo, mi-t%C3%B3pico es válido. Este formato es importante cuando realizas llamadas REST.

Cree un tema

Crea un tema antes de publicarlo o suscribirte a él.

Consola

Para crear un tema, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Temas de Pub/Sub.

    Ir a temas

  2. Haga clic en Crear tema.

  3. En el campo ID de tema, ingresa un ID para tu tema.

  4. Mantén la opción Agregar una suscripción predeterminada.

  5. No selecciones las otras opciones.

  6. Haga clic en Crear tema.

gcloud CLI

Para crear un tema, ejecuta el comando gcloud pubsub topics create:

gcloud pubsub topics create TOPIC_ID

REST

Para crear un tema, usa el método projects.topics.create:

La solicitud debe autenticarse con un token de acceso en el encabezado Authorization. A fin de obtener un token de acceso para las credenciales predeterminadas actuales de la aplicación, usa el siguiente comando: gcloud auth application-default print-access-token.

PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
Authorization: Bearer ACCESS_TOKEN
    

Aquí:

  • PROJECT_ID es el ID del proyecto.
  • TOPIC_ID es tu ID del tema.
  • Respuesta:

    {
     "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C++.

    namespace pubsub = ::google::cloud::pubsub;
    [](pubsub::TopicAdminClient client, std::string project_id,
       std::string topic_id) {
      auto topic = client.CreateTopic(pubsub::TopicBuilder(
          pubsub::Topic(std::move(project_id), std::move(topic_id))));
      // Note that kAlreadyExists is a possible error when the library retries.
      if (topic.status().code() == google::cloud::StatusCode::kAlreadyExists) {
        std::cout << "The topic already exists\n";
        return;
      }
      if (!topic) throw std::runtime_error(topic.status().message());
    
      std::cout << "The topic was successfully created: " << topic->DebugString()
                << "\n";
    }

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C#.

    
    using Google.Cloud.PubSub.V1;
    using Grpc.Core;
    using System;
    
    public class CreateTopicSample
    {
        public Topic CreateTopic(string projectId, string topicId)
        {
            PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
            var topicName = TopicName.FromProjectTopic(projectId, topicId);
            Topic topic = null;
    
            try
            {
                topic = publisher.CreateTopic(topicName);
                Console.WriteLine($"Topic {topic.Name} created.");
            }
            catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
            {
                Console.WriteLine($"Topic {topicName} already exists.");
            }
            return topic;
        }
    }

    Go

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Go.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub"
    )
    
    func create(w io.Writer, projectID, topicID string) error {
    	// projectID := "my-project-id"
    	// topicID := "my-topic"
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("pubsub.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	t, err := client.CreateTopic(ctx, topicID)
    	if err != nil {
    		return fmt.Errorf("CreateTopic: %v", err)
    	}
    	fmt.Fprintf(w, "Topic created: %v\n", t)
    	return nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Java.

    
    import com.google.cloud.pubsub.v1.TopicAdminClient;
    import com.google.pubsub.v1.Topic;
    import com.google.pubsub.v1.TopicName;
    import java.io.IOException;
    
    public class CreateTopicExample {
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String topicId = "your-topic-id";
    
        createTopicExample(projectId, topicId);
      }
    
      public static void createTopicExample(String projectId, String topicId) throws IOException {
        try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
          TopicName topicName = TopicName.of(projectId, topicId);
          Topic topic = topicAdminClient.createTopic(topicName);
          System.out.println("Created topic: " + topic.getName());
        }
      }
    }

    Node.js

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Node.js.

    /**
     * TODO(developer): Uncomment this variable before running the sample.
     */
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    
    // Imports the Google Cloud client library
    const {PubSub} = require('@google-cloud/pubsub');
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function createTopic() {
      // Creates a new topic
      await pubSubClient.createTopic(topicNameOrId);
      console.log(`Topic ${topicNameOrId} created.`);
    }
    
    createTopic();

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub PHP.

    use Google\Cloud\PubSub\PubSubClient;
    
    /**
     * Creates a Pub/Sub topic.
     *
     * @param string $projectId  The Google project ID.
     * @param string $topicName  The Pub/Sub topic name.
     */
    function create_topic($projectId, $topicName)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->createTopic($topicName);
    
        printf('Topic created: %s' . PHP_EOL, $topic->name());
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Python.

    from google.cloud import pubsub_v1
    
    # TODO(developer)
    # project_id = "your-project-id"
    # topic_id = "your-topic-id"
    
    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(project_id, topic_id)
    
    topic = publisher.create_topic(request={"name": topic_path})
    
    print(f"Created topic: {topic.name}")

    Ruby

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Ruby.

    # topic_id = "your-topic-id"
    require "google/cloud/pubsub"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topic = pubsub.create_topic topic_id
    
    puts "Topic #{topic.name} created."

    Limitaciones de las políticas de la organización

    Las políticas de la organización pueden restringir la creación de temas, por ejemplo, una política puede restringir el almacenamiento de mensajes en una región de Compute Engine. Para evitar errores de creación de tema, examina y actualiza las políticas de la organización, según sea necesario, antes de crear un tema.

    Si acabas de crear tu proyecto, espera unos minutos hasta que se inicialice la política de la organización antes de crear un tema.

    Ir a Políticas de la organización

    Crea un tema con un esquema

    Cuando crees un tema, te recomendamos que le asignes un esquema.

    A continuación, se incluyen algunos lineamientos sobre el uso de esquemas:

    • No puedes agregar esquemas a temas existentes.
    • Solo puedes especificar un esquema cuando creas un tema.
    • Después de que un esquema se asocia con un tema, no puedes actualizar el esquema ni quitar su asociación con ese tema.
    • Puedes aplicar el mismo esquema a otros temas nuevos.
    • Si borras un esquema, la publicación en todos los temas asociados fallará.

    Para obtener más información sobre los esquemas, consulta Crea y administra esquemas.

    Consola

    Para crear un tema y asignarle un esquema, sigue estos pasos:

    1. En Google Cloud Console, ve a la página Temas de Pub/Sub.

      Ir a temas

    2. Haga clic en Crear tema.

    3. En el campo ID de tema, ingresa un ID para tu tema.

    4. Marca la casilla Usar un esquema. Deja las otras opciones de configuración con sus valores predeterminados.

    5. Haz clic en Seleccionar un esquema de Pub/Sub y selecciona Crear un esquema nuevo. Si deseas usar un esquema existente, ve al paso 7.

    6. En el campo ID de esquema, ingresa un ID para tu esquema.

    7. En Tipo de esquema, selecciona Avro o búfer de protocolo.

    8. En el campo Definición del esquema, ingresa la definición del búfer de protocolo de Avro para tu esquema.

    9. Haz clic en Crear para guardar el esquema.

    10. En la ventana de diálogo Crear un tema, busque su esquema en el campo Select a Pub/Sub schema.

    11. Haz clic en Crear para guardar el tema y asignarlo con el esquema seleccionado.

    gcloud

    Para crear un tema asignado con un esquema creado con anterioridad, ejecuta el comando gcloud pubsub topics create:

    gcloud pubsub topics create TOPIC_ID \
            --message-encoding=ENCODING_TYPE \
            --schema=SCHEMA_ID

    Aquí:

    • TOPIC_ID es el ID del tema que estás creando.
    • ENCODING_TYPE es la codificación de los mensajes que se validan en el esquema. Este valor se debe configurar como JSON o BINARY.
    • SCHEMA_ID es el ID de un esquema existente.

    También puedes asignar un esquema desde otro proyecto de Google Cloud:

    gcloud pubsub topics create TOPIC_ID \
            --message-encoding=ENCODING_TYPE \
            --schema=SCHEMA_ID \
            --schema-project=SCHEMA_PROJECT \
            --project=TOPIC_PROJECT

    Aquí:

    • SCHEMA_PROJECT es el ID del proyecto de Google Cloud para el esquema.
    • TOPIC_PROJECT es el ID del proyecto de Google Cloud para el tema.

    REST

    Para crear un tema, usa el método projects.topics.create:

    Solicitud:

    La solicitud debe autenticarse con un token de acceso en el encabezado Authorization. A fin de obtener un token de acceso para las credenciales predeterminadas actuales de la aplicación, usa el siguiente comando: gcloud auth application-default print-access-token.

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    Cuerpo de la solicitud:

    {
      "schemaSettings": {
        "schema": "SCHEMA_NAME",
        "encoding": "ENCODING_TYPE"
      }
    }

    Aquí:

    • PROJECT_ID es el ID del proyecto.
    • TOPIC_ID es tu ID del tema.
    • SCHEMA_NAME es el nombre del esquema con el que se deben validar los mensajes publicados. El formato es: projects/PROJECT_ID/schemas/SCHEMA_ID.
    • ENCODING_TYPE es la codificación de los mensajes que se validan en el esquema. Se debe configurar como JSON o BINARY.

    Respuesta:

    {
      "name": "projects/PROJECT_ID/topics/TOPIC_ID",
      "schemaSettings": {
        "schema": "SCHEMA_NAME",
        "encoding": "ENCODING_TYPE"
      }
    }

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para C++.

    namespace pubsub = ::google::cloud::pubsub;
    [](pubsub::TopicAdminClient client, std::string project_id,
       std::string topic_id, std::string schema_id, std::string const& encoding) {
      auto const& schema = pubsub::Schema(project_id, std::move(schema_id));
      auto topic = client.CreateTopic(
          pubsub::TopicBuilder(
              pubsub::Topic(std::move(project_id), std::move(topic_id)))
              .set_schema(schema)
              .set_encoding(encoding == "JSON" ? google::pubsub::v1::JSON
                                               : google::pubsub::v1::BINARY));
      // Note that kAlreadyExists is a possible error when the library retries.
      if (topic.status().code() == google::cloud::StatusCode::kAlreadyExists) {
        std::cout << "The topic already exists\n";
        return;
      }
      if (!topic) throw std::runtime_error(topic.status().message());
    
      std::cout << "The topic was successfully created: " << topic->DebugString()
                << "\n";
    }

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para C#.

    
    using Google.Cloud.PubSub.V1;
    using Grpc.Core;
    using System;
    
    public class CreateTopicWithSchemaSample
    {
        public Topic CreateTopicWithSchema(string projectId, string topicId, string schemaName, Encoding encoding)
        {
            PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
            var topicName = TopicName.FromProjectTopic(projectId, topicId);
            Topic topic = new Topic
            {
                Name = topicName.ToString(),
                SchemaSettings = new SchemaSettings
                {
                    Schema = schemaName,
                    Encoding = encoding
                }
            };
    
            Topic receivedTopic = null;
            try
            {
                receivedTopic = publisher.CreateTopic(topic);
                Console.WriteLine($"Topic {topic.Name} created.");
            }
            catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
            {
                Console.WriteLine($"Topic {topicName} already exists.");
            }
            return receivedTopic;
        }
    }

    Comienza a usarlo

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Go.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub"
    )
    
    func createTopicWithSchema(w io.Writer, projectID, topicID, schemaID string, encoding pubsub.SchemaEncoding) error {
    	// projectID := "my-project-id"
    	// topicID := "my-topic"
    	// schemaID := "my-schema-id"
    	// encoding := pubsub.EncodingJSON
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("pubsub.NewClient: %v", err)
    	}
    
    	tc := &pubsub.TopicConfig{
    		SchemaSettings: &pubsub.SchemaSettings{
    			Schema:   fmt.Sprintf("projects/%s/schemas/%s", projectID, schemaID),
    			Encoding: encoding,
    		},
    	}
    	t, err := client.CreateTopicWithConfig(ctx, topicID, tc)
    	if err != nil {
    		return fmt.Errorf("CreateTopicWithConfig: %v", err)
    	}
    	fmt.Fprintf(w, "Topic with schema created: %#v\n", t)
    	return nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Java.

    
    import com.google.api.gax.rpc.AlreadyExistsException;
    import com.google.cloud.pubsub.v1.TopicAdminClient;
    import com.google.pubsub.v1.Encoding;
    import com.google.pubsub.v1.SchemaName;
    import com.google.pubsub.v1.SchemaSettings;
    import com.google.pubsub.v1.Topic;
    import com.google.pubsub.v1.TopicName;
    import java.io.IOException;
    
    public class CreateTopicWithSchemaExample {
    
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String topicId = "your-topic-id";
        // Use an existing schema.
        String schemaId = "your-schema-id";
        // Choose either BINARY or JSON message serialization in this topic.
        Encoding encoding = Encoding.BINARY;
    
        createTopicWithSchemaExample(projectId, topicId, schemaId, encoding);
      }
    
      public static void createTopicWithSchemaExample(
          String projectId, String topicId, String schemaId, Encoding encoding) throws IOException {
        TopicName topicName = TopicName.of(projectId, topicId);
        SchemaName schemaName = SchemaName.of(projectId, schemaId);
    
        SchemaSettings schemaSettings =
            SchemaSettings.newBuilder().setSchema(schemaName.toString()).setEncoding(encoding).build();
    
        try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
    
          Topic topic =
              topicAdminClient.createTopic(
                  Topic.newBuilder()
                      .setName(topicName.toString())
                      .setSchemaSettings(schemaSettings)
                      .build());
    
          System.out.println("Created topic with schema: " + topic.getName());
        } catch (AlreadyExistsException e) {
          System.out.println(schemaName + "already exists.");
        }
      }
    }

    Node.js

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.

    /**
     * TODO(developer): Uncomment these variables before running the sample.
     */
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    // const schemaName = 'YOUR_SCHEMA_NAME_OR_ID';
    // const encodingType = 'BINARY';
    
    // Imports the Google Cloud client library
    const {PubSub} = require('@google-cloud/pubsub');
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function createTopicWithSchema(
      topicNameOrId,
      schemaNameOrId,
      encodingType
    ) {
      // Get the fully qualified schema name.
      const schema = pubSubClient.schema(schemaNameOrId);
      const fullName = await schema.getName();
    
      // Creates a new topic with a schema. Note that you might also
      // pass Encodings.Json or Encodings.Binary here.
      await pubSubClient.createTopic({
        name: topicNameOrId,
        schemaSettings: {
          schema: fullName,
          encoding: encodingType,
        },
      });
      console.log(`Topic ${topicNameOrId} created with schema ${fullName}.`);
    }

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para PHP.

    use Google\Cloud\PubSub\PubSubClient;
    use Google\Cloud\PubSub\Schema;
    
    /**
     * Create a topic with a schema.
     *
     * @param string $projectId
     * @param string $topicId
     * @param string $schemaId
     * @param string $encoding
     */
    function create_topic_with_schema($projectId, $topicId, $schemaId, $encoding)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
    
        $schema = $pubsub->schema($schemaId);
    
        $topic = $pubsub->createTopic($topicId, [
            'schemaSettings' => [
                // The schema may be provided as an instance of the schema type,
                // or by using the schema ID directly.
                'schema' => $schema,
                // Encoding may be either `BINARY` or `JSON`.
                // Provide a string or a constant from Google\Cloud\PubSub\V1\Encoding.
                'encoding' => $encoding,
            ]
        ]);
    
        printf('Topic %s created', $topic->name());
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Python.

    from google.api_core.exceptions import AlreadyExists, InvalidArgument
    from google.cloud.pubsub import PublisherClient, SchemaServiceClient
    from google.pubsub_v1.types import Encoding
    
    # TODO(developer): Replace these variables before running the sample.
    # project_id = "your-project-id"
    # topic_id = "your-topic-id"
    # schema_id = "your-schema-id"
    # Choose either BINARY or JSON as valid message encoding in this topic.
    # message_encoding = "BINARY"
    
    publisher_client = PublisherClient()
    topic_path = publisher_client.topic_path(project_id, topic_id)
    
    schema_client = SchemaServiceClient()
    schema_path = schema_client.schema_path(project_id, schema_id)
    
    if message_encoding == "BINARY":
        encoding = Encoding.BINARY
    elif message_encoding == "JSON":
        encoding = Encoding.JSON
    else:
        encoding = Encoding.ENCODING_UNSPECIFIED
    
    try:
        response = publisher_client.create_topic(
            request={
                "name": topic_path,
                "schema_settings": {"schema": schema_path, "encoding": encoding},
            }
        )
        print(f"Created a topic:\n{response}")
    
    except AlreadyExists:
        print(f"{topic_id} already exists.")
    except InvalidArgument:
        print("Please choose either BINARY or JSON as a valid message encoding type.")

    Ruby

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Ruby.

    # topic_id = "your-topic-id"
    # schema_id = "your-schema-id"
    # Choose either BINARY or JSON as valid message encoding in this topic.
    # message_encoding = :binary
    require "google/cloud/pubsub"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topic = pubsub.create_topic topic_id, schema_name: schema_id, message_encoding: message_encoding
    
    puts "Topic #{topic.name} created."

    Borrar un tema

    Cuando borras un tema, no se borran sus suscripciones. El trabajo pendiente de mensajes de la suscripción está disponible para los suscriptores. Después de borrar un tema, sus suscripciones tienen el nombre del tema _deleted-topic_. Si intentas crear un tema con el mismo nombre que acabas de borrar, es probable que aparezca un error durante un período breve.

    Consola

    1. En la consola de Google Cloud, ve a la página Temas de Pub/Sub.

      Ir a temas

    2. Selecciona un tema y haz clic en Más acciones.

    3. Haz clic en Borrar.

      Aparecerá la ventana Borrar tema.

    4. Ingresa delete y, luego, haz clic en Borrar.

    gcloud CLI

    Para borrar un tema, usa el comando gcloud pubsub topics delete:

    gcloud pubsub topics delete TOPIC_ID

    REST

    Para borrar un tema, usa el método projects.topics.delete:

    Solicitud:

    La solicitud debe autenticarse con un token de acceso en el encabezado Authorization. A fin de obtener un token de acceso para las credenciales predeterminadas actuales de la aplicación, usa el siguiente comando: gcloud auth application-default print-access-token.

    DELETE https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
        

    Aquí:

  • PROJECT_ID es el ID del proyecto.
  • TOPIC_ID es tu ID del tema.
  • Respuesta:

    Si la solicitud es correcta, la respuesta es un objeto JSON vacío.

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C++.

    namespace pubsub = ::google::cloud::pubsub;
    [](pubsub::TopicAdminClient client, std::string const& project_id,
       std::string const& topic_id) {
      auto status = client.DeleteTopic(
          pubsub::Topic(std::move(project_id), std::move(topic_id)));
      // Note that kNotFound is a possible result when the library retries.
      if (status.code() == google::cloud::StatusCode::kNotFound) {
        std::cout << "The topic was not found\n";
        return;
      }
      if (!status.ok()) throw std::runtime_error(status.message());
    
      std::cout << "The topic was successfully deleted\n";
    }

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C#.

    
    using Google.Cloud.PubSub.V1;
    
    public class DeleteTopicSample
    {
        public void DeleteTopic(string projectId, string topicId)
        {
            PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
            TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
            publisher.DeleteTopic(topicName);
        }
    }

    Go

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Go.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub"
    )
    
    func delete(w io.Writer, projectID, topicID string) error {
    	// projectID := "my-project-id"
    	// topicID := "my-topic"
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("pubsub.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	t := client.Topic(topicID)
    	if err := t.Delete(ctx); err != nil {
    		return fmt.Errorf("Delete: %v", err)
    	}
    	fmt.Fprintf(w, "Deleted topic: %v\n", t)
    	return nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Java.

    
    import com.google.api.gax.rpc.NotFoundException;
    import com.google.cloud.pubsub.v1.TopicAdminClient;
    import com.google.pubsub.v1.TopicName;
    import java.io.IOException;
    
    public class DeleteTopicExample {
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String topicId = "your-topic-id";
    
        deleteTopicExample(projectId, topicId);
      }
    
      public static void deleteTopicExample(String projectId, String topicId) throws IOException {
        try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
          TopicName topicName = TopicName.of(projectId, topicId);
          try {
            topicAdminClient.deleteTopic(topicName);
            System.out.println("Deleted topic.");
          } catch (NotFoundException e) {
            System.out.println(e.getMessage());
          }
        }
      }
    }

    Node.js

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Node.js.

    /**
     * TODO(developer): Uncomment this variable before running the sample.
     */
    // const topicNameOrId = 'YOUR_TOPIC_NAME_OR_ID';
    
    // Imports the Google Cloud client library
    const {PubSub} = require('@google-cloud/pubsub');
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function deleteTopic() {
      /**
       * TODO(developer): Uncomment the following line to run the sample.
       */
      // const topicName = 'my-topic';
    
      // Deletes the topic
      await pubSubClient.topic(topicNameOrId).delete();
      console.log(`Topic ${topicNameOrId} deleted.`);
    }
    
    deleteTopic().catch(console.error);

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub PHP.

    use Google\Cloud\PubSub\PubSubClient;
    
    /**
     * Creates a Pub/Sub topic.
     *
     * @param string $projectId  The Google project ID.
     * @param string $topicName  The Pub/Sub topic name.
     */
    function delete_topic($projectId, $topicName)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        $topic = $pubsub->topic($topicName);
        $topic->delete();
    
        printf('Topic deleted: %s' . PHP_EOL, $topic->name());
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Python.

    from google.cloud import pubsub_v1
    
    # TODO(developer)
    # project_id = "your-project-id"
    # topic_id = "your-topic-id"
    
    publisher = pubsub_v1.PublisherClient()
    topic_path = publisher.topic_path(project_id, topic_id)
    
    publisher.delete_topic(request={"topic": topic_path})
    
    print(f"Topic deleted: {topic_path}")

    Ruby

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Ruby.

    # topic_id = "your-topic-id"
    require "google/cloud/pubsub"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topic = pubsub.topic topic_id
    topic.delete
    
    puts "Topic #{topic_id} deleted."

    Enumerar un tema

    Consola

    • En la consola de Google Cloud, ve a la página Temas de Pub/Sub.

      Ir a temas

      En la página Temas, se enumeran todos los temas disponibles.

    gcloud CLI

    Para enumerar los temas, usa el comando gcloud pubsub topics list:

    gcloud pubsub topics list

    REST

    Para enumerar temas, usa el método projects.topics.list:

    Solicitud:

    La solicitud debe autenticarse con un token de acceso en el encabezado Authorization. A fin de obtener un token de acceso para las credenciales predeterminadas actuales de la aplicación, usa el siguiente comando: gcloud auth application-default print-access-token.

    GET https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics
    Authorization: Bearer ACCESS_TOKEN
        

    Aquí:

  • PROJECT_ID es el ID del proyecto.
  • Respuesta:

    {
      "topics": [
        {
          "name": "projects/PROJECT_ID/topics/mytopic1",
          ...
        },
        {
          "name": "projects/PROJECT_ID/topics/mytopic2",
          ...
        }
      ]
    }

    C++

    Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C++.

    namespace pubsub = ::google::cloud::pubsub;
    [](pubsub::TopicAdminClient client, std::string const& project_id) {
      int count = 0;
      for (auto const& topic : client.ListTopics(project_id)) {
        if (!topic) throw std::runtime_error(topic.status().message());
        std::cout << "Topic Name: " << topic->name() << "\n";
        ++count;
      }
      if (count == 0) {
        std::cout << "No topics found in project " << project_id << "\n";
      }
    }

    C#

    Antes de probar esta muestra, sigue las instrucciones de configuración de C# en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub C#.

    
    using Google.Api.Gax.ResourceNames;
    using Google.Cloud.PubSub.V1;
    using System.Collections.Generic;
    
    public class ListProjectTopicsSample
    {
        public IEnumerable<Topic> ListProjectTopics(string projectId)
        {
            PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
            ProjectName projectName = ProjectName.FromProject(projectId);
            IEnumerable<Topic> topics = publisher.ListTopics(projectName);
            return topics;
        }
    }

    Go

    Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Go.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/pubsub"
    	"google.golang.org/api/iterator"
    )
    
    func list(projectID string) ([]*pubsub.Topic, error) {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := pubsub.NewClient(ctx, projectID)
    	if err != nil {
    		return nil, fmt.Errorf("pubsub.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	var topics []*pubsub.Topic
    
    	it := client.Topics(ctx)
    	for {
    		topic, err := it.Next()
    		if err == iterator.Done {
    			break
    		}
    		if err != nil {
    			return nil, fmt.Errorf("Next: %v", err)
    		}
    		topics = append(topics, topic)
    	}
    
    	return topics, nil
    }
    

    Java

    Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Java.

    
    import com.google.cloud.pubsub.v1.TopicAdminClient;
    import com.google.pubsub.v1.ProjectName;
    import com.google.pubsub.v1.Topic;
    import java.io.IOException;
    
    public class ListTopicsExample {
      public static void main(String... args) throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
    
        listTopicsExample(projectId);
      }
    
      public static void listTopicsExample(String projectId) throws IOException {
        try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
          ProjectName projectName = ProjectName.of(projectId);
          for (Topic topic : topicAdminClient.listTopics(projectName).iterateAll()) {
            System.out.println(topic.getName());
          }
          System.out.println("Listed all topics.");
        }
      }
    }

    Node.js

    Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Node.js.

    // Imports the Google Cloud client library
    const {PubSub} = require('@google-cloud/pubsub');
    
    // Creates a client; cache this for further use
    const pubSubClient = new PubSub();
    
    async function listAllTopics() {
      // Lists all topics in the current project
      const [topics] = await pubSubClient.getTopics();
      console.log('Topics:');
      topics.forEach(topic => console.log(topic.name));
    }
    
    listAllTopics().catch(console.error);

    PHP

    Antes de probar esta muestra, sigue las instrucciones de configuración de PHP en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub PHP.

    use Google\Cloud\PubSub\PubSubClient;
    
    /**
     * Lists all Pub/Sub topics.
     *
     * @param string $projectId  The Google project ID.
     */
    function list_topics($projectId)
    {
        $pubsub = new PubSubClient([
            'projectId' => $projectId,
        ]);
        foreach ($pubsub->topics() as $topic) {
            printf('Topic: %s' . PHP_EOL, $topic->name());
        }
    }

    Python

    Antes de probar esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Python.

    from google.cloud import pubsub_v1
    
    # TODO(developer)
    # project_id = "your-project-id"
    
    publisher = pubsub_v1.PublisherClient()
    project_path = f"projects/{project_id}"
    
    for topic in publisher.list_topics(request={"project": project_path}):
        print(topic)

    Ruby

    Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub Ruby.

    require "google/cloud/pubsub"
    
    pubsub = Google::Cloud::Pubsub.new
    
    topics = pubsub.topics
    
    puts "Topics in project:"
    topics.each do |topic|
      puts topic.name
    end

    De forma predeterminada, se muestra un máximo de 100 resultados por consulta. Puedes especificar un valor alternativo de hasta 1,000 con el parámetro de tamaño de página.

    Supervisar temas

    Puedes supervisar los temas desde Pub/Sub.

    ¿Qué sigue?