Mengaitkan skema dengan topik

Dokumen ini menunjukkan cara mengaitkan skema untuk topik Pub/Sub.

Sebelum memulai

Peran dan izin yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk mengaitkan dan mengelola skema, minta administrator untuk memberi Anda peran IAM Pub/Sub Editor (roles/pubsub.editor) di project Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk mengaitkan dan mengelola skema. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk mengaitkan dan mengelola skema:

  • Buat skema: pubsub.schemas.create
  • Lampirkan skema ke topik: pubsub.schemas.attach
  • Commit revisi skema: pubsub.schemas.commit
  • Hapus skema atau revisi skema: pubsub.schemas.delete
  • Mendapatkan skema atau revisi skema: pubsub.schemas.get
  • Skema daftar: pubsub.schemas.list
  • Mencantumkan revisi skema: pubsub.schemas.listRevisions
  • Melakukan rollback skema: pubsub.schemas.rollback
  • Validasi pesan: pubsub.schemas.validate
  • Mendapatkan kebijakan IAM untuk skema: pubsub.schemas.getIamPolicy
  • Konfigurasi kebijakan IAM untuk skema: pubsub.schemas.setIamPolicy

Anda mung juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaanlainnya.

Anda dapat memberikan peran dan izin ke akun utama seperti pengguna, grup, domain, atau akun layanan. Anda dapat membuat skema dalam satu project dan melampirkannya ke topik yang berada di project berbeda. Pastikan Anda memiliki izin yang diperlukan untuk setiap project.

Panduan untuk mengaitkan skema dengan topik

Anda dapat mengaitkan skema dengan suatu topik saat membuat atau mengedit topik. Berikut adalah panduan untuk mengaitkan skema dengan suatu topik:

  • Anda dapat mengaitkan skema dengan satu atau beberapa topik.

    Setelah skema dikaitkan dengan suatu topik, setiap pesan yang diterima topik dari penerbit harus mengikuti skema tersebut.

  • Saat mengaitkan skema dengan topik, Anda juga harus menentukan encoding pesan yang akan dipublikasikan sebagai BINARY atau JSON. Jika menggunakan JSON dengan skema Avro, perhatikan aturan encoding untuk union.

  • Jika skema yang terkait dengan topik memiliki revisi, pesan harus cocok dengan encoding dan memvalidasi terhadap revisi dalam rentang yang tersedia. Jika tidak melakukan validasi, pesan akan gagal dipublikasikan.

    Revisi dicoba dalam urutan kronologis terbalik yang didasarkan pada waktu pembuatan. Untuk membuat revisi skema, lihat Meng-commit revisi skema.

Logika validasi untuk skema pesan

Saat mengaitkan skema dengan suatu topik dan jika skema tersebut memiliki revisi, Anda dapat menentukan rentang subset revisi yang akan digunakan. Jika Anda tidak menentukan suatu rentang, seluruh rentang akan digunakan untuk validasi.

Jika Anda tidak menetapkan revisi sebagai First revision allowed, revisi terlama yang ada untuk skema tersebut akan digunakan untuk validasi. Jika Anda tidak menentukan revisi sebagai Last revision allowed, revisi terbaru yang ada untuk skema akan digunakan.

Mari kita ambil contoh Skema S yang dilampirkan ke topik T.

Skema S memiliki ID revisi A,B, C, dan D yang dibuat secara berurutan, dengan A adalah revisi pertama atau terlama. Tidak ada skema yang identik satu sama lain, atau rollback dari skema yang sudah ada.

  • Jika Anda hanya menetapkan kolom First revision allowed sebagai B, pesan yang hanya sesuai dengan skema A akan ditolak, sedangkan pesan yang sesuai dengan skema B, C, dan D akan diterima.

  • Jika Anda hanya menetapkan kolom Last revision allowed sebagai C, pesan yang sesuai dengan skema A, B, dan C akan diterima, dan pesan yang hanya sesuai dengan skema D akan ditolak.

  • Jika Anda menetapkan kedua kolom First revision allowed sebagai B dan Last revision allowed sebagai C, pesan yang sesuai dengan skema B dan C akan diterima.

  • Anda juga dapat menetapkan revisi pertama dan terakhir ke ID revisi yang sama. Dalam kasus ini, hanya pesan yang sesuai dengan revisi tersebut yang akan diterima.

Membuat dan mengaitkan skema saat membuat topik

Anda dapat membuat topik dengan skema menggunakan Google Cloud Console, gcloud CLI, Pub/Sub API, atau Library Klien Cloud.

Konsol

  1. Di konsol Google Cloud, buka halaman Pub/Sub topics.

    Buka Topik

  2. Klik Create topic.

  3. Di kolom ID Topik, masukkan ID untuk topik Anda.

    Untuk menamai topik, lihat panduan.

  4. Centang kotak Use a schema.

    Pertahankan setelan default untuk kolom lainnya.

    Anda dapat membuat skema atau menggunakan skema yang sudah ada.

  5. Jika Anda membuat skema, ikuti langkah-langkah berikut: `

    1. Untuk Select a Pub/Sub schema, pilih Create a new schema.

    Halaman Buat skema ditampilkan di tab sekunder.

    Ikuti langkah-langkah di bagian Membuat skema.

    1. Kembali ke tab Buat topik dan klik Muat ulang.

    2. Telusuri skema Anda di kolom Pilih skema Pub/Sub.

    3. Pilih encoding pesan sebagai JSON atau Biner.

    Skema yang baru saja Anda buat memiliki ID revisi. Anda dapat membuat revisi skema tambahan seperti yang dibahas dalam Meng-commit revisi skema.

  6. Jika Anda mengaitkan skema yang sudah dibuat, ikuti langkah-langkah berikut:

    1. Untuk Select a Pub/Sub schema, pilih skema yang ada.

    2. Pilih encoding pesan sebagai JSON atau Biner.

  7. Opsional: Jika skema yang dipilih memiliki revisi, untuk Revon Range, gunakan menu drop-down untuk First revision allowed dan Last revision allowed.

Anda dapat menentukan kedua kolom, menentukan salah satunya, atau mempertahankan setelan default berdasarkan persyaratan Anda.

  1. Pertahankan setelan default untuk kolom lainnya.

  2. Klik Create untuk menyimpan topik dan menetapkannya ke skema yang dipilih.

gcloud

Untuk membuat topik yang ditetapkan dengan skema yang dibuat sebelumnya, jalankan perintah gcloud pubsub topics create:

gcloud pubsub topics create TOPIC_ID \
        --message-encoding=ENCODING_TYPE \
        --schema=SCHEMA_ID \
        --first-revision-id=FIRST_REVISION_ID \
        --last-revision-id=LAST_REVISION_ID \

Dengan keterangan:

  • TOPIC_ID adalah ID untuk topik yang Anda buat.
  • ENCODING_TYPE adalah encoding pesan yang divalidasi terhadap skema. Nilai ini harus ditetapkan ke JSON atau BINARY.
  • SCHEMA_ID adalah ID dari skema yang ada.
  • FIRST_REVISION_ID adalah ID revisi terlama untuk memvalidasi.
  • LAST_REVISION_ID adalah ID revisi terbaru untuk divalidasi.

--first-revision-id dan --last-revision-id bersifat opsional.

Anda juga dapat menetapkan skema dari project Google Cloud yang berbeda:

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

Dengan keterangan:

  • SCHEMA_PROJECT adalah project ID dari project Google Cloud untuk skema.
  • TOPIC_PROJECT adalah project ID dari project Google Cloud untuk topik tersebut.

REST

Untuk membuat topik, gunakan metode projects.topics.create:

Permintaan:

Permintaan harus diautentikasi dengan token akses pada header Authorization. Guna mendapatkan token akses untuk Kredensial Default Aplikasi saat ini: gcloud auth application-default print-access-token.

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

Isi permintaan:

{
  "schemaSettings": {
    "schema": "SCHEMA_NAME",
    "encoding": "ENCODING_TYPE"
    "firstRevisionId": "FIRST_REVISION_ID"
    "lastRevisionId": "LAST_REVISION_ID"
  }
}

Dengan keterangan:

  • PROJECT_ID adalah project ID Anda.
  • TOPIC_ID adalah topic ID Anda.
  • SCHEMA_NAME adalah nama skema yang digunakan untuk memvalidasi pesan yang dipublikasikan. Formatnya adalah: projects/PROJECT_ID/schemas/SCHEMA_ID.
  • ENCODING_TYPE adalah encoding pesan yang divalidasi terhadap skema. Ini harus ditetapkan ke JSON atau BINARY.
  • FIRST_REVISION_ID adalah ID revisi terlama untuk memvalidasi.
  • LAST_REVISION_ID adalah ID revisi terbaru untuk divalidasi.

firstRevisionId dan lastRevisionId bersifat opsional.

Respons:

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

firstRevisionId dan lastRevisionId dihilangkan jika tidak disediakan dalam permintaan.

C++

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C++ di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C++ API.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::TopicAdminClient client, std::string project_id,
   std::string topic_id, std::string schema_id, std::string const& encoding) {
  google::pubsub::v1::Topic request;
  request.set_name(pubsub::Topic(project_id, std::move(topic_id)).FullName());
  request.mutable_schema_settings()->set_schema(
      pubsub::Schema(std::move(project_id), std::move(schema_id)).FullName());
  request.mutable_schema_settings()->set_encoding(
      encoding == "JSON" ? google::pubsub::v1::JSON
                         : google::pubsub::v1::BINARY);
  auto topic = client.CreateTopic(request);

  // 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#

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C# API.


using Google.Cloud.PubSub.V1;
using Grpc.Core;
using System;

public class CreateTopicWithSchemaSample
{
    public Topic CreateTopicWithSchema(string projectId, string topicId, string schemaId, Encoding encoding)
    {
        PublisherServiceApiClient publisher = PublisherServiceApiClient.Create();
        var topicName = TopicName.FromProjectTopic(projectId, topicId);
        Topic topic = new Topic
        {
            TopicName = topicName,
            SchemaSettings = new SchemaSettings
            {
                SchemaAsSchemaName = SchemaName.FromProjectSchema(projectId, schemaId),
                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;
    }
}

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Go API.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub"
)

func createTopicWithSchemaRevisions(w io.Writer, projectID, topicID, schemaID, firstRevisionID, lastRevisionID string, encoding pubsub.SchemaEncoding) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	// schemaID := "my-schema-id"
	// firstRevisionID := "my-revision-id"
	// lastRevisionID := "my-revision-id"
	// encoding := pubsub.EncodingJSON
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}

	tc := &pubsub.TopicConfig{
		SchemaSettings: &pubsub.SchemaSettings{
			Schema:          fmt.Sprintf("projects/%s/schemas/%s", projectID, schemaID),
			FirstRevisionID: firstRevisionID,
			LastRevisionID:  lastRevisionID,
			Encoding:        encoding,
		},
	}
	t, err := client.CreateTopicWithConfig(ctx, topicID, tc)
	if err != nil {
		return fmt.Errorf("CreateTopicWithConfig: %w", err)
	}
	fmt.Fprintf(w, "Created topic with schema revision: %#v\n", t)
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Pub/Sub 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 CreateTopicWithSchemaRevisionsExample {

  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;
    // Set the minimum and maximum revsion ID
    String firstRevisionId = "your-revision-id";
    String lastRevisionId = "your-revision-id";

    createTopicWithSchemaRevisionsExample(
        projectId, topicId, schemaId, firstRevisionId, lastRevisionId, encoding);
  }

  public static void createTopicWithSchemaRevisionsExample(
      String projectId,
      String topicId,
      String schemaId,
      String firstRevisionid,
      String lastRevisionId,
      Encoding encoding)
      throws IOException {
    TopicName topicName = TopicName.of(projectId, topicId);
    SchemaName schemaName = SchemaName.of(projectId, schemaId);

    SchemaSettings schemaSettings =
        SchemaSettings.newBuilder()
            .setSchema(schemaName.toString())
            .setFirstRevisionId(firstRevisionid)
            .setLastRevisionId(lastRevisionId)
            .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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Node.js API.

/**
 * 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}.`);
}

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Node.js API.

/**
 * 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
import {PubSub} from '@google-cloud/pubsub';

// Creates a client; cache this for further use
const pubSubClient = new PubSub();

async function createTopicWithSchema(
  topicNameOrId: string,
  schemaNameOrId: string,
  encodingType: 'BINARY' | 'JSON'
) {
  // 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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan PHP di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub PHP API.

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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Python API.

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"
# first_revision_id = "your-revision-id"
# last_revision_id = "your-revision-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,
                "first_revision_id": first_revision_id,
                "last_revision_id": last_revision_id,
            },
        }
    )
    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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Ruby di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Ruby API.

# 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

pubsub = Google::Cloud::Pubsub.new

topic = pubsub.create_topic topic_id, schema_name: schema_id, message_encoding: message_encoding

puts "Topic #{topic.name} created."

Mengedit skema yang terkait dengan topik

Anda dapat mengedit topik untuk melampirkan skema, menghapus skema, atau memperbarui rentang revisi yang digunakan untuk memvalidasi pesan. Secara umum, jika ada perubahan yang direncanakan untuk skema yang digunakan, Anda dapat melakukan commit revisi baru dan memperbarui rentang revisi yang digunakan untuk topik tersebut.

Anda dapat mengedit skema yang terkait dengan topik menggunakan Konsol Google Cloud, gcloud CLI, Pub/Sub API, atau Library Klien Cloud.

Konsol

  1. Di konsol Google Cloud, buka halaman Pub/Sub topics.

    Buka Topik

  2. Klik ID Topik untuk sebuah topik.

  3. Di halaman detail topik, klik Edit.

  4. Anda dapat melakukan perubahan berikut pada skema.

    Mungkin diperlukan waktu beberapa menit agar perubahan diterapkan.

    • Jika Anda ingin menghapus skema dari topik, di halaman Edit topic, hapus centang pada kotak Use a schema.

    • Jika ingin mengubah skema, di bagian Schema, pilih nama skema.

    Perbarui kolom lain sesuai kebutuhan.

    • Jika Anda ingin memperbarui rentang revisi, untuk Revisi Rentang, gunakan menu drop-down untuk Revisi pertama diizinkan dan Revisi terakhir diizinkan.

    Anda dapat menentukan kedua kolom, menentukan salah satunya, atau mempertahankan setelan default berdasarkan persyaratan Anda.

  5. Klik Update untuk menyimpan perubahan.

gcloud

gcloud pubsub topics update TOPIC_ID \
        --message-encoding=ENCODING_TYPE \
        --schema=SCHEMA_NAME \
        --first-revision-id=FIRST_REVISION_ID \
        --last-revision-id=LAST_REVISION_ID \

Dengan keterangan:

  • TOPIC_ID adalah ID untuk topik yang Anda buat.
  • ENCODING_TYPE adalah encoding pesan yang divalidasi terhadap skema. Nilai ini harus ditetapkan ke JSON atau BINARY.
  • SCHEMA_NAME adalah nama skema yang ada.
  • FIRST_REVISION_ID adalah ID revisi terlama untuk memvalidasi.
  • LAST_REVISION_ID adalah ID revisi terbaru untuk divalidasi.

--first-revision-id dan --last-revision-id bersifat opsional.

REST

Untuk memperbarui topik, gunakan metode projects.topics.patch:

Permintaan:

Permintaan harus diautentikasi dengan token akses pada header Authorization. Guna mendapatkan token akses untuk Kredensial Default Aplikasi saat ini: gcloud auth application-default print-access-token.

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

Isi permintaan:

{
  "schemaSettings": {
    "schema": "SCHEMA_NAME",
    "encoding": "ENCODING_TYPE"
    "firstRevisionId": "FIRST_REVISION_ID"
    "lastRevisionId": "LAST_REVISION_ID"
    "update_mask":
  }
}

Dengan keterangan:

  • PROJECT_ID adalah project ID Anda.
  • TOPIC_ID adalah topic ID Anda.
  • SCHEMA_NAME adalah nama skema yang digunakan untuk memvalidasi pesan yang dipublikasikan. Formatnya adalah: projects/PROJECT_ID/schemas/SCHEMA_ID.
  • ENCODING_TYPE adalah encoding pesan yang divalidasi terhadap skema. Ini harus ditetapkan ke JSON atau BINARY.
  • FIRST_REVISION_ID adalah ID revisi terlama untuk memvalidasi.
  • LAST_REVISION_ID adalah ID revisi terbaru untuk divalidasi.

firstRevisionId dan lastRevisionId bersifat opsional.

Respons:

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

firstRevisionId dan lastRevisionId keduanya tidak ditetapkan setelah update.

C++

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C++ di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C++ API.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::TopicAdminClient client, std::string project_id,
   std::string topic_id, std::string const& first_revision_id,
   std::string const& last_revision_id) {
  google::pubsub::v1::UpdateTopicRequest request;
  auto* request_topic = request.mutable_topic();
  request_topic->set_name(
      pubsub::Topic(std::move(project_id), std::move(topic_id)).FullName());
  request_topic->mutable_schema_settings()->set_first_revision_id(
      first_revision_id);
  request_topic->mutable_schema_settings()->set_last_revision_id(
      last_revision_id);
  *request.mutable_update_mask()->add_paths() =
      "schema_settings.first_revision_id";
  *request.mutable_update_mask()->add_paths() =
      "schema_settings.last_revision_id";
  auto topic = client.UpdateTopic(request);

  if (!topic) throw std::move(topic).status();

  std::cout << "The topic was successfully updated: " << topic->DebugString()
            << "\n";
}

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Go API.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub"
)

func updateTopicSchema(w io.Writer, projectID, topicID, firstRevisionID, lastRevisionID string) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	// firstRevisionID := "my-revision-id"
	// lastRevisionID := "my-revision-id"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	t := client.Topic(topicID)

	// This updates the first / last revision ID for the topic's schema.
	// To clear the schema entirely, use a zero valued (empty) SchemaSettings.
	tc := pubsub.TopicConfigToUpdate{
		SchemaSettings: &pubsub.SchemaSettings{
			FirstRevisionID: firstRevisionID,
			LastRevisionID:  lastRevisionID,
		},
	}

	gotTopicCfg, err := t.Update(ctx, tc)
	if err != nil {
		fmt.Fprintf(w, "topic.Update err: %v\n", gotTopicCfg)
		return err
	}
	fmt.Fprintf(w, "Updated topic with schema: %#v\n", gotTopicCfg)
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan Memulai: Menggunakan Library Klien. Untuk informasi selengkapnya, lihat dokumentasi referensi API Pub/Sub Java.


import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.protobuf.FieldMask;
import com.google.pubsub.v1.SchemaSettings;
import com.google.pubsub.v1.Topic;
import com.google.pubsub.v1.TopicName;
import com.google.pubsub.v1.UpdateTopicRequest;
import java.io.IOException;

public class UpdateTopicSchemaExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    // This is an existing topic that has schema settings attached to it.
    String topicId = "your-topic-id";
    // Set the minimum and maximum revsion ID
    String firstRevisionId = "your-revision-id";
    String lastRevisionId = "your-revision-id";

    UpdateTopicSchemaExample.updateTopicSchemaExample(
        projectId, topicId, firstRevisionId, lastRevisionId);
  }

  public static void updateTopicSchemaExample(
      String projectId, String topicId, String firstRevisionid, String lastRevisionId)
      throws IOException {
    try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {

      TopicName topicName = TopicName.of(projectId, topicId);

      // Construct the schema settings with the changes you want to make.
      SchemaSettings schemaSettings =
          SchemaSettings.newBuilder()
              .setFirstRevisionId(firstRevisionid)
              .setLastRevisionId(lastRevisionId)
              .build();

      // Construct the topic with the schema settings you want to change.
      Topic topic =
          Topic.newBuilder()
              .setName(topicName.toString())
              .setSchemaSettings(schemaSettings)
              .build();

      // Construct a field mask to indicate which field to update in the topic.
      FieldMask updateMask =
          FieldMask.newBuilder()
              .addPaths("schema_settings.first_revision_id")
              .addPaths("schema_settings.last_revision_id")
              .build();

      UpdateTopicRequest request =
          UpdateTopicRequest.newBuilder().setTopic(topic).setUpdateMask(updateMask).build();

      Topic response = topicAdminClient.updateTopic(request);

      System.out.println("Updated topic with schema: " + topic.getName());
    }
  }
}

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Python API.

from google.api_core.exceptions import InvalidArgument, NotFound
from google.cloud.pubsub import PublisherClient

# TODO(developer): Replace these variables before running the sample.
# project_id = "your-project-id"
# topic_id = "your-topic-id"
# first_revision_id = "your-revision-id"
# last_revision_id = "your-revision-id"

publisher_client = PublisherClient()
topic_path = publisher_client.topic_path(project_id, topic_id)

try:
    response = publisher_client.update_topic(
        request={
            "topic": {
                "name": topic_path,
                "schema_settings": {
                    "first_revision_id": first_revision_id,
                    "last_revision_id": last_revision_id,
                },
            },
            "update_mask": "schemaSettings.firstRevisionId,schemaSettings.lastRevisionId",
        }
    )
    print(f"Updated a topic schema:\n{response}")

except NotFound:
    print(f"{topic_id} not found.")
except InvalidArgument:
    print("Schema settings are not valid.")
0

Langkah selanjutnya