بازگشت به کتابخانهکتابخانه13.3سریالایزیشن و قرارداد داده: JSON تا Schema Registry
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 13.3فصل ۱۳وب بلادرنگ و پروتکل‌های مدرن

سریالایزیشن و قرارداد داده: JSON تا Schema Registry

  • ~۱۳ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

هر پیامی که بین دو سرویس رد می‌شود — روی HTTP یا Kafka — باید به بایت تبدیل و برگردد. انتخاب فرمت و مدیریت تکامل آن، تفاوت سیستمی است که نسخه جدیدش بدون ترس دیپلوی می‌شود با سیستمی که هر تغییر کوچک، consumer هایش را می‌شکند.

فرمتحجم/سرعتSchemaبهترین جا
JSONمتنی، بزرگ، کندندارد (یا JSON Schema جدا)API های عمومی، دیباگ، انعطاف
Protobufباینری فشرده، سریعالزامی (.proto) با شماره فیلدسرویس-به-سرویس داخلی، gRPC
Avroباینری، schema همراه/مرجعالزامی، evolution قویرویدادهای Kafka در مقیاس
MessagePackباینریِ JSON-مانندنداردجایگزین سریع JSON بدون schema

سازگاری: قانون مهم‌تر از فرمت

Backward compatible
کد جدید بتواند داده نوشته‌شده با schema قدیم را بخواند — مثلاً افزودن فیلد اختیاری با مقدار پیش‌فرض.
Forward compatible
کد قدیمی بتواند داده نسخه جدید را بخواند (فیلد ناشناخته را نادیده بگیرد).
Full
هر دو جهت؛ استاندارد طلایی برای رویدادهای Kafka که consumer ها با نسخه‌های مختلف زنده‌اند.
  • قواعد امن: فقط فیلد اختیاری با default اضافه کن؛ هرگز فیلد را حذف یا rename نکن؛ نوع فیلد را عوض نکن؛ در Protobuf شماره فیلد را بازیافت نکن.
  • Schema Registry (مثل Confluent) کنار Kafka می‌ایستد: producer schema را ثبت می‌کند، registry سازگاری را enforce می‌کند، consumer با ID نسخه درست می‌خواند — بدون registry، topic ها به معدل‌فیل قراضه تبدیل می‌شوند.
  • تغییر ناسازگار = topic جدید (مثل API v2) + مهاجرت تدریجی مصرف‌کننده‌ها.

gRPC و بقیه

  • gRPC = Protobuf + HTTP/2: چهار مدل (unary ،server-streaming ،client-streaming ،bi-directional)؛ برای سرویس‌های داخلی سریع و با قرارداد سفت، ولی بدون پروکسی مرورگر مستقیم کار نمی‌کند (gRPC-Web).
  • GraphQL مسئله دیگری را حل می‌کند: انعطاف کلاینت روی داده — به قیمت کش پیچیده، خطر N+1 (DataLoader درس ۳۶ را ببین) و نیاز به محدودکردن عمق کوئری.
  • قرارداد هرچه باشد، در CI تست سازگاری (contract test) بگذار تا شکستن قبل از دیپلوی گرفته شود (درس ۴۷).

به زبان ساده

قرارداد داده باید مثل قرارداد رسمی نسخه داشته باشد: JSON خوانا ولی سست است، Protobuf/Avro فشرده و قانون‌مند، و Schema Registry نگهبان سازگاری نسخه‌هاست.

مثال واقعی

وقتی تولیدکننده پیام، فیلد price را به تومان تغییر می‌دهد، Schema Registry قبل از انتشار جلویش را می‌گیرد که مصرف‌کننده‌های قدیمی نشکنند — مثل کنترل نسخه قرارداد بین دو شرکت.

دانش‌سنجی

آزمون درس

۴ Q
01
چرا Protobuf در ارتباط داخلی سرویس‌ها از JSON بهتر است؟
02
کدام تغییر روی schema رویداد Kafka «امن» است؟
03
کار Schema Registry چیست؟
04
باید یک فیلد اجباری جدید به رویداد اضافه کنی (سازگاری را می‌شکند). راه درست؟