Crear un tema

En Pub/Sub, un tema es un recurso con nombre que representa un feed de mensajes. Debes crear un tema para poder publicar contenido en él o suscribirte a él. Pub/Sub admite dos tipos de temas: temas estándar y temas de importación.

En este documento se describe cómo crear un tema estándar de Pub/Sub. Si quieres obtener más información sobre los temas de importación y cómo crear uno, consulta el artículo Acerca de los temas de importación.

Para crear un tema, puedes usar la Google Cloud consola, la CLI de Google Cloud, la biblioteca de cliente o la API Pub/Sub.

Antes de empezar

Roles y permisos necesarios

Para obtener los permisos que necesitas para crear un tema, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Editor de Pub/Sub(roles/pubsub.editor) en tu proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear un tema. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para crear un tema, se necesitan los siguientes permisos:

  • Concede este permiso para crear un tema en el proyecto: pubsub.topics.create

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Puede configurar el control de acceso a nivel de proyecto y de recurso individual. Puedes crear una suscripción en un proyecto y adjuntarla a un tema ubicado en otro proyecto. Asegúrate de que tienes los permisos necesarios para cada proyecto.

Propiedades de un tema

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

Añadir una suscripción predeterminada

Añade una suscripción predeterminada al tema de Pub/Sub. Puedes crear otra suscripción para el tema una vez que se haya creado. La suscripción predeterminada tiene las siguientes propiedades:

  • ID de suscripción de -sub
  • Tipo de entrega de extracciones
  • Retención de mensajes durante siete días
  • Caducidad después de 31 días de inactividad
  • Plazo límite de confirmación de 10 segundos
  • Política de reintentos inmediata

Usar un esquema

Un esquema es un formato que debe seguir el campo de datos del mensaje. Un esquema es un contrato entre el editor y el suscriptor que Pub/Sub aplica. Los esquemas de temas ayudan a estandarizar los tipos de mensajes y los permisos para que los puedan usar diferentes equipos de tu organización. Pub/Sub crea una autoridad central para los tipos de mensajes y los permisos. Para crear un tema con un esquema, consulta la descripción general de los esquemas.

Habilitar la ingesta

Si habilita esta propiedad, podrá ingerir datos de streaming de fuentes externas en un tema para usar las funciones de Google Cloud. Para crear un tema de importación para la ingestión, consulta lo siguiente:

Habilitar la retención de mensajes

Especifica cuánto tiempo conserva el tema de Pub/Sub los mensajes después de la publicación. Una vez que haya transcurrido el periodo de conservación de los mensajes, es posible que Pub/Sub descarte el mensaje independientemente de su estado de confirmación. Se cobran tarifas de almacenamiento por almacenar todos los mensajes publicados en el tema.

  • Valor predeterminado: no habilitado
  • Valor mínimo: 10 minutos
  • Valor máximo = 31 días

Exportar datos de mensajes a BigQuery

Si habilitas esta propiedad, puedes crear una suscripción de BigQuery que escriba mensajes en una tabla de BigQuery a medida que se reciban. No es necesario configurar un cliente de suscriptor independiente. Para obtener más información sobre las suscripciones de BigQuery, consulta el artículo Suscripciones de BigQuery.

Crear copias de seguridad de datos de mensajes en Cloud Storage

Si habilitas esta propiedad, puedes crear una suscripción de Cloud Storage que escriba mensajes en una tabla de Cloud Storage a medida que se reciben. No es necesario configurar un cliente de suscriptor independiente. Para obtener más información sobre las suscripciones a Cloud Storage, consulta Suscripciones a Cloud Storage.

Transformaciones

Los SMTs de temas permiten hacer modificaciones ligeras en los datos y atributos de los mensajes directamente en Pub/Sub. Esta función permite limpiar, filtrar o convertir el formato de los datos antes de que los mensajes se publiquen en el tema.

Para obtener más información sobre las SMTs, consulta la descripción general de las SMTs.

Google-owned and Google-managed encryption key

Especifica que el tema está cifrado conGoogle-owned and Google-managed encryption keys. Pub/Sub cifra los mensajes con Google-owned and Google-managed encryption keys de forma predeterminada, por lo que, si elige esta opción, se mantendrá el comportamiento predeterminado. Google gestiona y rota las claves automáticamente, lo que garantiza que tus mensajes estén siempre protegidos con el cifrado más seguro disponible. Esta opción no requiere ninguna configuración adicional. Para obtener más información sobre Google-owned and Google-managed encryption keys, consulta Cifrado predeterminado con Google-owned and Google-managed encryption keys.

Clave de Cloud KMS

Especifica si el tema está cifrado con una clave de cifrado gestionada por el cliente (CMEK). Pub/Sub cifra los mensajes con Google-owned and Google-managed encryption keys de forma predeterminada. Si especifica esta opción, Pub/Sub usará el patrón de cifrado de envolvente con CMEK. Con este método, Cloud KMS no cifra los mensajes. En su lugar, Cloud KMS encripta las claves de cifrado de datos (DEKs) que Pub/Sub crea para cada tema. Pub/Sub encripta los mensajes con la DEK más reciente que se haya generado para el tema. Pub/Sub descifra los mensajes poco antes de que se entreguen a los suscriptores. Para obtener más información sobre cómo crear una clave, consulta Configurar el cifrado de mensajes.

Crear un tema

Crea un tema para poder publicar o suscribirte a él.

Consola

Para crear un tema, sigue estos pasos:

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

    Ir a Crear tema

  2. En el campo ID de tema, introduce un ID para el tema. Para obtener más información sobre cómo poner nombre a los temas, consulta las directrices de nomenclatura.

  3. Mantén la opción Añadir una suscripción predeterminada.

  4. Opcional. No selecciones las otras opciones.

  5. Haz clic en Crear tema.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

    gcloud pubsub topics create TOPIC_ID
  3. 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. Para obtener un token de acceso de las credenciales de aplicación predeterminadas actuales, usa gcloud auth application-default print-access-token.

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

    Donde:

    • PROJECT_ID es el ID del proyecto.
    • El ID de tu tema es TOPIC_ID.

    Respuesta:

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

    C++

    Antes de probar este ejemplo, sigue las instrucciones de configuración de C++ que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C++ de Pub/Sub.

    namespace pubsub = ::google::cloud::pubsub;
    namespace pubsub_admin = ::google::cloud::pubsub_admin;
    [](pubsub_admin::TopicAdminClient client, std::string project_id,
       std::string topic_id) {
      auto topic = client.CreateTopic(
          pubsub::Topic(std::move(project_id), std::move(topic_id)).FullName());
      // 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::move(topic).status();
    
      std::cout << "The topic was successfully created: " << topic->DebugString()
                << "\n";
    }

    C#

    Antes de probar este ejemplo, sigue las instrucciones de configuración de C# que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C# de Pub/Sub.

    
    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

    En el siguiente ejemplo se usa la versión principal de la biblioteca de cliente de Pub/Sub de Go (v2). Si sigues usando la biblioteca v1, consulta la guía de migración a la versión 2. Para ver una lista de ejemplos de código de la versión 1, consulta los ejemplos de código obsoletos.

    Antes de probar este ejemplo, sigue las instrucciones de configuración de Go que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Pub/Sub.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/pubsub/v2"
    	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
    )
    
    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: %w", err)
    	}
    	defer client.Close()
    
    	topic := &pubsubpb.Topic{
    		Name: fmt.Sprintf("projects/%s/topics/%s", projectID, topicID),
    	}
    	t, err := client.TopicAdminClient.CreateTopic(ctx, topic)
    	if err != nil {
    		return fmt.Errorf("CreateTopic: %w", err)
    	}
    	fmt.Fprintf(w, "Topic created: %v\n", t)
    	return nil
    }
    

    Java

    Antes de probar este ejemplo, sigue las instrucciones de configuración de Java que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Java de Pub/Sub.

    
    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 este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.

    /**
     * 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(topicNameOrId) {
      // Creates a new topic
      await pubSubClient.createTopic(topicNameOrId);
      console.log(`Topic ${topicNameOrId} created.`);
    }

    Node.ts

    Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.

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

    PHP

    Antes de probar este ejemplo, sigue las instrucciones de configuración de PHP que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Pub/Sub para 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 este ejemplo, sigue las instrucciones de configuración de Python que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de Pub/Sub.

    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

    En el siguiente ejemplo se usa la biblioteca de cliente de Ruby Pub/Sub v3. Si sigues usando la biblioteca v2, consulta la guía de migración a la versión 3. Para ver una lista de ejemplos de código de Ruby v2, consulta los ejemplos de código obsoletos.

    Antes de probar este ejemplo, sigue las instrucciones de configuración de Ruby que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Ruby de Pub/Sub.

    # topic_id = "your-topic-id"
    
    pubsub = Google::Cloud::PubSub.new
    topic_admin = pubsub.topic_admin
    
    topic = topic_admin.create_topic name: pubsub.topic_path(topic_id)
    
    puts "Topic #{topic.name} created."

Restricciones de las políticas de organización

Las políticas de 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 al crear temas, examine y actualice las políticas de la organización según sea necesario antes de crear un tema.

Si tu proyecto se ha creado recientemente, espera unos minutos a que se inicialice la política de organización antes de crear un tema.

Ir a Políticas de organización

Para obtener más información, consulta Configurar políticas de almacenamiento de mensajes.

Siguientes pasos

Apache Kafka® es una marca registrada de Apache Software Foundation o sus filiales en Estados Unidos u otros países.