ללא Schema Registry, נושאי Kafka הם זרמי בתים עיוורים. יצרן משנה את פורמט ה-JSON — הצרכן קורס עם NullPointerException. לפי סטטיסטיקות, 70% מתקלות הייצור קשורות לאי-תאימות סכמות. אנו פותרים בעיה זו עם Confluent Schema Registry: סכמת ההודעה מנוהלת בגרסאות, האבולוציה נשלטת, ושינויים לא תואמים נחסמים לפני הפרסום. אנו מתקינים Schema Registry עבור Apache Avro, Protobuf, או JSON Schema במפתח מלא — נבחן את הפרויקט שלך תוך יום אחד.
Schema Registry הוא שירות HTTP נפרד המאחסן סכמות בנושא _schemas של Kafka. בשליחה הראשונה, היצרן רושם את הסכמה ומקבל schema_id (מספר שלם). במקום הסכמה המלאה, רק ה-schema_id (4 בתים) מוטמע בכל הודעה — זהו פורמט ה-wire של Confluent. הודעת Avro תופסת פי 2-3 פחות מקום מאשר סכמת JSON מקבילה.
Producer → [magic byte 0x00][schema_id 4 bytes][serialized payload] → Kafka Consumer → читает schema_id → запрашивает схему из Registry → десериализует למה Schema Registry הוא חובה לייצור?
ללא Schema Registry, אבולוציית סכמות הופכת לסיוט. אתה מוסיף שדה ל-JSON — צרכנים ישנים שלא מצפים לו עלולים לקרוס. Schema Registry במצב BACKWARD מבטיח שהסכמה החדשה תואמת לגרסאות קודמות. זה מונע השבתות. הניסיון שלנו: יותר מ-50 פרויקטים עם Kafka, ואף אחד לא עבר בלי Registry. אימוץ Schema Registry מקצר את זמן הדיבוג ב-80%, וחוסך $2k–5k בשנה.
התקנה והגדרה בסיסית
התקנה טיפוסית דרך Docker Compose:
---
version: '3.8'
services:
schema-registry:
image: confluentinc/cp-schema-registry:7.6.0
ports:
- "8081:8081"
environment:
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: "kafka-1:9092,kafka-2:9092,kafka-3:9092"
SCHEMA_REGISTRY_HOST_NAME: schema-registry
SCHEMA_REGISTRY_LISTENERS: "http://0.0.0.0:8081"
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: "_schemas"
SCHEMA_REGISTRY_KAFKASTORE_TOPIC_REPLICATION_FACTOR: 3
SCHEMA_REGISTRY_SCHEMA_COMPATIBILITY_LEVEL: "BACKWARD"
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT
restart: unless-stopped
---לייצור — לפחות 2 מופעים מאחורי מאזן עומסים, אחד הוא master. אנו מבטיחים סובלנות לתקלות.
איך לבחור מצב תאימות?
| מצב | תיאור | מתי להשתמש |
|---|---|---|
| BACKWARD | סכמה חדשה יכולה לקרוא נתונים שנכתבו על ידי סכמה ישנה | בחירה סטנדרטית לייצור |
| FORWARD | סכמה ישנה יכולה לקרוא נתונים שנכתבו על ידי סכמה חדשה | כאשר צרכנים מתעדכנים לאט יותר מיצרנים |
| FULL | שני הכיוונים | רק כאשר הכרחי בהחלט |
| NONE | ללא בדיקות | רק לפיתוח, לא לייצור |
אנו ממליצים על Producer → [magic byte 0x00][schema_id 4 bytes][serialized payload] → Kafka Consumer → читает schema_id → запрашивает схему из Registry → десериализует לרוב התרחישים. זה מאפשר הוספת שדות עם ברירת מחדל והסרת שדות ללא ברירת מחדל.
מה אם סכמות לא תואמות?
אם CI/CD נכשל עם שגיאת אי-תאימות, יש שתי אפשרויות: או להחזיר את שינוי הסכמה ולשפר אותו, או ליצור נושא חדש עם גרסת הסכמה החדשה ולהעביר יצרנים/צרכנים. Schema Registry מקל על החזרה לאחור על ידי רישום מחדש של הגרסה הקודמת.
רישום סכמות דרך REST API
לאחר הגדרת הסכמה, רשום אותה ב-Schema Registry באמצעות REST API:
curl -X POST http://schema-registry:8081/subjects/order-events-value/versions \
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
-d '{ "schema": "{\"type\":\"record\",\"name\":\"OrderEvent\",\"namespace\":\"com.example.orders\",\"fields\":[{\"name\":\"event_id\",\"type\":\"string\"},{\"name\":\"order_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"double\"},{\"name\":\"created_at\",\"type\":{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}}]} }'"} השוואת פורמטים של Avro, Protobuf ו-JSON Schema
| פורמט | יתרונות | חסרונות |
|---|---|---|
| Avro | בינארי קומפקטי, אינטגרציה טבעית עם Confluent | מורכבות ללא יצירת קוד |
| Protobuf | מהיר יותר מ-Avro, תומך בשפות רבות | דורש קומפילציה של .proto למחלקות |
| JSON Schema | קריא לאדם, אין צורך ביצירת קוד | גודל גדול יותר, פחות כלים |
הבחירה תלויה במערכת האקולוגית: Avro הוא סטנדרט ל-Kafka, Protobuf למיקרוסרוויסים עם gRPC, ו-JSON Schema לאינטגרציות פשוטות. פרטים נוספים בתיעוד הרשמי של Confluent Schema Registry.
יצרן Java עם אינטגרציית Schema Registry
ל-Java, השתמש ב-version: '3.8' services: schema-registry: image: confluentinc/cp-schema-registry:7.6.0 ports: - "8081:8081" environment: SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: "kafka-1:9092,kafka-2:9092,kafka-3:9092" SCHEMA_REGISTRY_HOST_NAME: schema-registry SCHEMA_REGISTRY_LISTENERS: "http://0.0.0.0:8081" SCHEMA_REGISTRY_KAFKASTORE_TOPIC: "_schemas" SCHEMA_REGISTRY_KAFKASTORE_TOPIC_REPLICATION_FACTOR: 3 SCHEMA_REGISTRY_SCHEMA_COMPATIBILITY_LEVEL: "BACKWARD" SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: PLAINTEXT restart: unless-stopped . הוסף תלויות ל-BACKWARD:
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.11.3</version>
</dependency> Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-1:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
props.put("schema.registry.url", "http://schema-registry:8081");
props.put("auto.register.schemas", false); // В проде — запрещаем авторегистрацию
props.put("use.latest.version", true);
KafkaProducer<String, OrderEvent> producer = new KafkaProducer<>(props);
OrderEvent event = OrderEvent.newBuilder()
.setEventId(UUID.randomUUID().toString())
.setOrderId(12345L)
.setUserId(67890L)
.setStatus(OrderStatus.CREATED)
.setCreatedAt(Instant.now().toEpochMilli())
.build();
producer.send(new ProducerRecord<>("order-events", event.getOrderId().toString(), event));הגדרת curl -X POST http://schema-registry:8081/subjects/order-events-value/versions \ -H "Content-Type: application/vnd.schemaregistry.v1+json" \ -d '{ "schema": "{\"type\":\"record\",\"name\":\"OrderEvent\",\"namespace\":\"com.example.orders\",\"fields\":[{\"name\":\"event_id\",\"type\":\"string\"},{\"name\":\"order_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"double\"},{\"name\":\"created_at\",\"type\":{\"type\":\"long\",\"logicalType\":\"timestamp-millis\"}}]} }' ו-KafkaAvroSerializer היא חובה לייצור כדי למנוע רישום מקרי של סכמות לא מאומתות.
איך לשלב בדיקות תאימות ב-CI/CD?
לפני פריסת גרסת שירות חדשה, הרץ סקריפט לבדיקת תאימות:
#!/bin/bash
SCHEMA_FILE="src/main/avro/OrderEvent.avsc"
SUBJECT="order-events-value"
REGISTRY_URL="http://schema-registry:8081"
SCHEMA_JSON=$(jq -c . "$SCHEMA_FILE")
RESPONSE=$(curl -s -X POST \
"${REGISTRY_URL}/compatibility/subjects/${SUBJECT}/versions/latest" \
-H "Content-Type: application/vnd.schemaregistry.v1+json" \
-d "{\"schema\": $(echo $SCHEMA_JSON | jq -R .)}")
COMPATIBLE=$(echo $RESPONSE | jq -r '.is_compatible')
if [ "$COMPATIBLE" != "true" ]; then
echo "FAIL: Schema is not compatible: $RESPONSE"
exit 1
fi
echo "OK: Schema is backward compatible"אם התאימות מופרת — ה-pipeline נכשל, והסכמה הלא תואמת לא מגיעה לייצור.
מה כלול בהתקנת Schema Registry במפתח מלא
- פריסת Schema Registry בייצור (מינימום 2 צמתים)
- הגדרה ורישום סכמות Avro לכל הנושאים
- הגדרת מצבי תאימות (BACKWARD / FORWARD / FULL)
- אינטגרציית יצרנים (Java/Python) עם סריאליזרים
- הוספת בדיקות תאימות ל-CI/CD pipeline
- תיעוד תהליך אבולוציית הסכמות לצוות
- הדרכת מפתחים (יום אחד)
לוח זמנים: בין 3 ל-5 ימים תלוי במספר הנושאים. העלות מחושבת באופן אישי.
ניטור ותמיכה
Schema Registry מייצא מדדים ל-Prometheus. אנו מגדירים התראות על שינויים לא תואמים וכשלי master. אנו מבטיחים: לאחר ההתקנה, שום שינוי לא תואם לא מגיע לייצור. ניסיון: למעלה מ-5 שנים בעבודה עם Kafka, 50+ פרויקטים. הזמינו ייעוץ על ארכיטקטורת ה-Kafka שלכם — נעזור ליישם Schema Registry תוך 3 ימים.







