מאגר הסכימות מספק מאגרי סכימות שמשותפים לכמה אפליקציות. בעבר, ללא מאגר סכימות, צוותים הסתמכו על הסכמים לא רשמיים – כמו הסכמים בעל פה, מסמכים משותפים שלא נאכפו באופן פרוגרמטי או דפי ויקי – כדי להגדיר את פורמט ההודעה ואת אופן הסריאליזציה והדה-סריאליזציה של ההודעות. מאגר הסכימות מבטיח קידוד ופענוח עקביים של ההודעות.
במסמך הזה מפורטת סקירה כללית של התכונה 'מאגר סכימות' בשירות המנוהל ל-Apache Kafka, הרכיבים שלה ותהליך העבודה הבסיסי.
הסבר על סכימות
נניח שאתם בונים אפליקציה שעוקבת אחרי הזמנות של לקוחות. יכול להיות שתשתמשו בנושא Kafka שנקרא customer_orders כדי להעביר הודעות שמכילות מידע על כל הזמנה. הודעת הזמנה טיפוסית עשויה לכלול את שדות המידע הבאים:
מזהה ההזמנה
שם הלקוח
שם המוצר
כמות
מחיר
כדי להבטיח שההודעות האלה יהיו מובנות באופן עקבי, אפשר להגדיר סכימה. דוגמה בפורמט Apache Avro:
{
"type": "record",
"name": "Order",
"namespace": "com.example",
"fields": [
{"name": "orderId", "type": "string"},
{"name": "customerName", "type": "string"},
{"name": "productName", "type": "string"},
{"name": "quantity", "type": "int"},
{"name": "price", "type": "double"}
]
}
דוגמה זהה בפורמט Protocol Buffer.
syntax = "proto3";
package com.example;
option java_multiple_files = true; // Optional: Recommended for Java users
option java_package = "com.example"; // Optional: Explicit Java package
message Order {
string orderId = 1;
string customerName = 2;
string productName = 3;
int32 quantity = 4; // Avro int maps to Protobuf int32
double price = 5;
}
הסכימה הזו היא תוכנית להודעה. הוא מציין שהודעה order כוללת חמישה שדות: מזהה הזמנה, שם לקוח, שם מוצר, כמות ומחיר. הוא גם מציין את סוג הנתונים של כל שדה.
אם לקוח צרכני מקבל הודעה בינארית שמקודדת באמצעות הסכימה הזו, הוא צריך לדעת בדיוק איך לפרש אותה. כדי לאפשר זאת, המפיק מאחסן את סכימת order במרשם סכימות ומעביר מזהה של הסכימה יחד עם ההודעה. כל עוד צרכן ההודעה יודע באיזה רישום נעשה שימוש, הוא יכול לאחזר את אותה סכימה ולפענח את ההודעה.
נניח שרוצים להוסיף שדה, orderDate, להודעות order. יוצרים גרסה חדשה של סכימת order ורושמים אותה תחת אותו נושא. כך אפשר לעקוב אחרי ההתפתחות של הסכימה לאורך זמן.
הוספת שדה היא שינוי שתואם קדימה. המשמעות היא שצרכנים שמשתמשים בגרסאות ישנות יותר של סכימה (ללא orderDate) עדיין יכולים לקרוא ולעבד הודעות שנוצרו באמצעות הסכימה החדשה. המערכת מתעלמת מהשדה החדש.
תאימות לאחור של מאגר הסכימות מאפשרת לאפליקציית צרכן שהוגדרה עם גרסה חדשה של סכימה לקרוא נתונים שנוצרו עם סכימה קודמת.
בדוגמה הזו, סכימת order הראשונית תהיה גרסה 1. כשמוסיפים את השדה orderDate, יוצרים גרסה 2 של סכימת order. שתי הגרסאות מאוחסנות באותו נושא, כך שאפשר לנהל עדכוני סכימה בלי לפגוע באפליקציות קיימות שאולי עדיין מסתמכות על גרסה 1.
הנה תצוגה מלמעלה למטה של מאגר סכימות לדוגמה בשם schema_registry_test, מאורגן לפי הקשר, נושא וגרסת סכימה:
customer_supportcontextordersubjectV1גרסה (כוללת את orderId, customerName, productName, quantity, price)גרסה
V2(מוסיפה ��ת orderDate ל-V1)
מהי סכימה
הודעות ב-Apache Kafka מורכבות ממחרוזות של בייטים. ללא מבנה מוגדר, אפליקציות צרכניות צריכות לתאם ישירות עם אפליקציות יצרניות כדי להבין איך לפרש את הבייטים האלה.
סכמה מספקת תיאור רשמי של הנתונים בהודעה. הוא מגדיר את השדות ואת סוגי הנתונים שלהם, כמו מחרוזת, מספר שלם או ערך בוליאני, וגם מבנים מוטמעים.
שירות מנוהל ל-Apache Kafka תומך בסכימות בפורמטים הבאים:
Protocol Buffers (Protobuf)
ה-API של מאגר הסכימות לא תומך ב-JSON.
תכונת רישום הסכימות שמשולבת בשירות המנוהל ל-Apache Kafka מאפשרת לכם ליצור סכימות כאלה, לנהל אותן ולהשתמש בהן עם לקוחות Kafka. מאגר הסכימות מטמיע את Confluent Schema Registry API בארכיטקטורת REST, שתואם לאפליקציות קיימות של Apache Kafka ולספריות לקוח נפוצות.
הארגון של רשם הסכימות
מאגר הסכימות משתמש במבנה היררכי כדי לארגן את הסכימות.
סכימה: המבנה וסוגי הנתונים של הודעה. כל סכימה מזוהה באמצעות מזהה סכימה. המזהה הזה משמש אפליקציות לאחזור הסכימה.
נושא: מאגר לוגי לגרסאות שונות של סכימה. הנושאים מנהלים את האופן שבו סכימות מתפתחות לאורך זמן באמצעות כללי תאימות. כל נושא בדרך כלל תואם לנושא או לאובייקט רשומה ב-Kafka.
גרסה: אם הלוגיקה העסקית מחייבת שינויים במבנה של הודעה, צריך ליצור ולרשום גרסה חדשה של הסכימה בנושא הרלוונטי.
כל גרסה מפנה לסכימה ספציפית. גרסאות של נושאים שונים יכולות להפנות לאותה סכימה אם הסכימה הבסיסית זהה.
הקשר: קיבוץ או מרחב שמות ברמה גבוהה לנושאים. הקשרים מאפשרים לצוותים או לאפליקציות שונים להשתמש באותו שם נושא בלי שיהיו התנגשויות באותו רישום סכימות.
יכולים להיות כמה הקשרים במאגר סכימות. הוא תמיד מכיל הקשר ברירת מחדל שמזוהה כ-
., שזה המקום שבו סכימות ונושאים מופיעים כשלא מצוין מזהה הקשר אחר.הקשר יכול להכיל כמה נושאים.
מאגר: המאגר ברמה העליונה של כל מערכת הסכימות. הוא מאחסן ומ��הל את כל הסכימות, הנושאים, הגרסאות וההקשרים.
תהליך העבודה של מאגר הסכימות
כדי לפעול לפי תהליך העבודה שמתואר בקטע הזה, אפשר לנסות את המדריך למתחילים בנושא יצירת הודעות Avro באמצעות מאגר הסכימות.
סדרות וביטול סדרות בלקוחות Kafka שלכם יוצרים אינטראקציה עם מאגר הסכימות כדי לוודא שההודעות תואמות לסכימה מוגדרת. זהו תהליך עבודה טיפוסי של מאגר סכימות בשירות מנוהל ל-Apache Kafka:
מאתחלים את אפליקציית היצרן עם סכימה ספציפית שצוינה כסיווג שנוצר על ידי Avro, ומגדירים אותה לשימוש במאגר סכימות מסוים ובספריית סריאליזציה.
מגדירים לקוח צרכן כך שישתמש בספריית ביטול הסדר המת��ימ�� ��ב��ותו ��אגר סכימות.
��זמן הריצה, הלקוח מעביר את אובייקט ההודעה לשיטת
producer.send, וספריית הלקוח של Kafka משתמשת בסריאליזציה שהוגדרה כדי להמיר את הרשומה הזו לבייטים שמקודדים ב-Avro.הסריאליזטור קובע שם נושא לסכימה על סמך אסטרטגיה מוגדרת של שם נושא בספריית הלקוח. לאחר מכן, הוא משתמש בשם הנושא הזה בבקשה לרישום הסכימה כדי לאחזר את המזהה של הסכימה. מידע נוסף זמין במאמר בנושא אסטרטגיות למתן שמות לנושאים.
אם הסכימה לא קיימת במאגר תחת שם הנושא הזה, אפשר להגדיר את הלקוח כך שירשום את הסכימה, ובמקרה כזה הוא יקבל את המזהה החדש שהוקצה.
מומלץ להימנע מההגדרה הזו בסביבות ייצור.
היצרן שולח את ההודעה עם הסריאליזציה ומזהה הסכימה לנושא המתאים בשרת Kafka.
ברוקר Kafka מאחסן את הייצוג של מערך הבייטים של ההודעה בנושא.
אפליקציית הצרכן מקבלת את ההודעה.
הפונקציה deserializer מאחזרת את הסכימה עם המזהה הזה ממאגר הסכימות.
ה-deserializer מנתח את ההודעה עבור אפליקציית הצרכן.
מגבלות
התכונות הבאות לא נתמכות במאגר הסכימות:
פורמטים של סכימה:
- פורמט סכימת JSON.
מצבי סכימה:
- מצב סכימה
READONLY_OVERRIDE.
- מצב סכימה
ערכי ההגדרה של הסכימה:
- ערכי ההגדרה
Normalizeו-Alias.
- ערכי ההגדרה
שיטות API:
- השיטה
ModifySchemaTags(/subjects/{subject}/versions/{version}/tags). - השיטה
GetLatestWithMetadata(/subjects/{subject}/metadata). - השיטה
ListSchemas(/schemas). - השיטה
DeleteSchemaMode. - בשיטה
GetVersion: הפרמטריםformat,deletedו-findTags. - בשיטה
CreateVersion: הפרמטריםmetadata,ruleSet,schemaTagsToAddו-schemaTagsToRemove. - לשיטה
UpdateSchemaMode: הפרמטרforce. - לשיטה
GetSchemaMode: הפרמטרdefaultToGlobal. - בשיטה
GetSchema: הפרמטריםWorkspaceMaxIdו-findTags. - לשיטה
ListVersions: הפרמטרdeletedOnly. - לשיטה
ListSubjects: הפרמטרdeletedOnly.
- השיטה