שיוך סכימה לנושא

במאמר הזה מוסבר איך לשייך סכימות לנושאים ב-Pub/Sub.

לפני שמתחילים

תפקידים והרשאות נדרשים

כדי לקבל את ההרשאות שנדרשות לשיוך ולניהול של סכימות, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד עריכה ב-Pub/Sub (roles/pubsub.editor) בפרויקט. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקיד המוגדר מראש הזה מכיל את ההרשאות שנדרשות לשיוך סכימות ולניהול שלהן. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לשייך סכימות ולנהל אותן, נדרשות ההרשאות הבאות:

  • יצירת סכימה: pubsub.schemas.create
  • צירוף סכימה לנושא: pubsub.schemas.attach
  • אישור שינוי בסכימה: pubsub.schemas.commit
  • מחיקת סכימה או עדכון של סכימה: pubsub.schemas.delete
  • קבלת סכימה או עדכונים בסכימה: pubsub.schemas.get
  • רשימת סכימות: pubsub.schemas.list
  • רשימת שינויים בסכימה: pubsub.schemas.listRevisions
  • החזרה של סכימה למצב קודם: pubsub.schemas.rollback
  • כדי לאמת הודעה: pubsub.schemas.validate
  • קבלת מדיניות IAM עבור סכימה: pubsub.schemas.getIamPolicy
  • מגדירים את מדיניות IAM לסכימה: pubsub.schemas.setIamPolicy

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

אתם יכולים להעניק תפקידים והרשאות לחשבונות ראשיים כמו משתמשים, קבוצות, דומיינים או חשבונות שירות. אפשר ליצור סכימה בפרויקט אחד ולצרף אותה לנושא שנמצא בפרויקט אחר. מוודאים שיש לכם את ההרשאות הנדרשות לכל פרויקט.

הנחיות לשיוך סכימה לנושא

אפשר לשייך סכימה לנושא כשיוצרים או עורכים נושא. אלה ההנחיות לשיוך סכימה לנושא:

  • אפשר לשייך סכימה לנושא אחד או יותר.

    אחרי שמשייכים סכימה לנושא, כל הודעה שהנושא מקבל מהמפרסמים חייבת להיות בהתאם לסכימה הזו.

  • כשמשייכים סכימה לנושא, צריך לציין גם את הקידוד של ההודעות שיפורסמו כ-BINARY או כ-JSON. אם משתמשים ב-JSON עם סכימת Avro, חשוב לשים לב לכללי הקידוד של איחודים.

  • אם לסכימה שמשויכת לנושא יש עדכונים, ההודעות צריכות להתאים לקידוד ולעבור אימות מול עדכון בטווח הזמין. אם הם לא מאומתים, ההודעה לא מתפרסמת.

    המערכת מנסה להשתמש בגרסאות לפי סדר כרונולוגי הפוך שמבוסס על זמן היצירה. כדי ליצור גרסה מתוקנת של סכימה, אפשר לעיין במאמר בנושא אישור גרסה מתוקנת של סכימה.

לוגיקת אימות של סכימת הודעות

כשמשייכים סכימה לנושא, ואם לסכימה יש גרסאות קודמות, אפשר לציין טווח של גרסאות קודמות לשימוש. אם לא מציינים טווח, המערכת משתמשת בטווח כולו לצורך אימות.

אם לא מציינים את מספר התיקון כהתיקון הראשון שמותר, המערכת משתמשת בתיקון הקיים הכי ישן של הסכימה לצורך אימות. אם לא מציינים גרסה כהגרסה האחרונה המותרת, המערכת משתמשת בגרסה הקיימת החדשה ביותר של הסכימה.

ניקח לדוגמה סכימה S שמצורפת לנושא T.

לסכימה S יש את מזהי הגרסאות A,B, C ו-D שנוצרו לפי הסדר, כאשר A היא הגרסה הראשונה או הכי ישנה. אף אחת מהסכימות לא זהה לסכימה אחרת או לביטול שינויים בסכימה קיימת.

  • אם מגדירים רק את השדה First revision allowed כ-B, הודעות שתואמות רק לסכימה A יידחו, אבל הודעות שתואמות לסכימות B,‏ C ו-D יתקבלו.

  • אם מגדירים רק את השדה Last revision allowed (הגרסה האחרונה המותרת) כ-C, הודעות שתואמות לסכימות A, B ו-C יתקבלו, והודעות שתואמות רק לסכימה D יידחו.

  • אם מגדירים את שני השדות First revision allowed כ-B ואת Last revision allowed כ-C, המערכת מקבלת הודעות שתואמות לסכימות B ו-C.

  • אפשר גם להגדיר את הגרסה הראשונה והאחרונה לאותו מזהה גרסה. במקרה כזה, רק הודעות שתואמות לגרסה הזו יתקבלו.

יצירה ושיוך של סכימה כשיוצרים נושא

אפשר ליצור נושא עם סכימה באמצעות מסוף Google Cloud , ה-CLI של gcloud,‏ Pub/Sub API או ספריות הלקוח ב-Cloud.

המסוף

  1. נכנסים לדף Pub/Sub topics במסוף Google Cloud .

    לדף Topics

  2. לוחצים על יצירת נושא.

  3. בשדה Topic ID (מזהה הנושא), מזינים מזהה לנושא.

    הנחיות למתן שמות לנושאים

  4. מסמנים את התיבה שימוש בסכימה.

    משאירים את הגדרות ברירת המחדל בשאר השדות.

    אתם יכולים ליצור סכימה או להשתמש בסכימה קיימת.

  5. אם אתם יוצרים סכימה, פועלים לפי השלבים הבאים: `

    1. בקטע Select a Pub/Sub schema, בוחרים באפשרות Create a new schema.

    הדף Create schema (יצירת סכימה) מוצג בכרטיסייה משנית.

    פועלים לפי השלבים במאמר בנושא יצירת סכימה.

    1. חוזרים לכרטיסייה יצירת נושא ולוחצים על רענון.

    2. מחפשים את הסכימה בשדה Select a Pub/Sub schema.

    3. בוחרים את קידוד ההודעה כ-JSON או כ-Binary.

    לסכימה שיצרתם יש מזהה גרסה. אפשר ליצור עדכונים נוספים לסכימה, כמו שמתואר במאמר בנושא אישור עדכון לסכימה.

  6. אם אתם משייכים סכימה שכבר יצרתם, פועלים לפי השלבים הבאים:

    1. בקטע Select a Pub/Sub schema, בוחרים סכימה קיימת.

    2. בוחרים את קידוד ההודעה כ-JSON או כ-Binary.

  7. אופציונלי: אם לסכימה שנבחרה יש גרסאות, בתפריטים הנפתחים של הגרסה הראשונה המותרת והגרסה האחרונה המותרת בוחרים את הגרסאות הרצויות בשדה טווח הגרסאות.

אתם יכולים לציין את שני השדות, לציין רק אחד מהם או להשאיר את הגדרות ברירת המחדל בהתאם לדרישות שלכם.

  1. משאירים את הגדרות ברירת המחדל בשאר השדות.

  2. לוחצים על יצירה כדי לשמור את הנושא ולהקצות אותו לסכימה שנבחרה.

gcloud

כדי ליצור נושא שמוקצה לו סכימה שנוצרה קודם, מריצים את הפקודה 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 \

כאשר:

  • TOPIC_ID הוא המזהה של הנושא שאתם יוצרים.
  • ENCODING_TYPE הוא הקידוד של ההודעות שאומתו מול הסכימה. הערך הזה צריך להיות JSON או BINARY.
  • SCHEMA_ID הוא המזהה של סכימה קיימת.
  • FIRST_REVISION_ID הוא המזהה של הגרסה הכי ישנה שרוצים לבצע אימות מולה.
  • LAST_REVISION_ID הוא המזהה של הגרסה העדכנית ביותר שצריך לאמת.

המאפיינים --first-revision-id ו---last-revision-id הם אופציונליים.

אפשר גם להקצות סכימה מפרויקט אחר של Google Cloud :

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

כאשר:

  • SCHEMA_PROJECT הוא מזהה הפרויקט של Google Cloud הפרויקט של הסכימה.
  • TOPIC_PROJECT הוא מזהה הפרויקט של Google Cloud הפרויקט שבו נמצא הנושא.

REST

כדי ליצור נושא, משתמשים בשיטה projects.topics.create:

בקשה:

הבקשה צריכה להיות מאומתת באמצעות אסימון גישה בכותרת Authorization. כדי לקבל אסימון גישה ל-Application Default Credentials הנוכחיים: gcloud auth application-default print-access-token.

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

גוף הבקשה:

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

כאשר:

  • PROJECT_ID הוא מזהה הפרויקט.
  • מספר הנושא שלך הוא TOPIC_ID.
  • SCHEMA_NAME הוא שם הסכימה שצריך לאמת מולה את ההודעות שמתפרסמות. הפורמט הוא: projects/PROJECT_ID/schemas/SCHEMA_ID.
  • ENCODING_TYPE הוא הקידוד של ההודעות שאומתו מול הסכימה. הערך חייב להיות JSON או BINARY.
  • FIRST_REVISION_ID הוא המזהה של הגרסה הכי ישנה שרוצים לבצע אימות מולה.
  • LAST_REVISION_ID הוא המזהה של הגרסה העדכנית ביותר שצריך לאמת.

המאפיינים firstRevisionId ו-lastRevisionId הם אופציונליים.

תשובה:

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

אם לא מציינים את firstRevisionId ואת lastRevisionId בבקשה, הם לא נכללים בה.

C++‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C++‎ במאמר תחילת העבודה המהירה: שימוש בספריות לקוח. מידע נוסף זמין במאמרי העזרה של 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#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של C# ‎ במאמר הפעלה מהירה: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של 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 Pub/Sub ‏ (v2). אם אתם עדיין משתמשים בספרייה v1, כדאי לעיין במדריך להעברה לגרסה v2. כדי לראות רשימה של דוגמאות קוד מגרסה 1, אפשר לעיין ב דוגמאות הקוד שהוצאו משימוש.

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Go במאמר מדריך למתחילים: שימוש בספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Pub/Sub Go API.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/pubsub/v2"
	"cloud.google.com/go/pubsub/v2/apiv1/pubsubpb"
)

func createTopicWithSchemaRevisions(w io.Writer, projectID, topicID, schemaID, firstRevisionID, lastRevisionID string) error {
	// projectID := "my-project-id"