دربارهٔ این فصل
یادداشتِ همراه نوارتا حالا به این فکر کردهاید که وقتی ساختار پایگاه داده یا مدل برنامه را تغییر میدهید، چه بلایی سر دادههای قدیمی روی دیسک یا در حال انتقال روی شبکه میآید؟ چطور میشود سرورها را بهروزرسانی کرد بدون اینکه کل سیستم از کار بیفتد یا دادهها خراب شوند؟
این موضوعات در کتاب «طراحی برنامههای دادهگرا» نوشتهٔ «مارتین کلپمن» در فصل چهارم با عنوان رمزگذاری و تکامل بررسی میشوند و اهمیت زیادی در پایداری سیستمهای مقیاسپذیر دارند.
اولین مسئله، استفاده از ابزارهای پیشفرض زبانهای برنامهنویسی برای ذخیره یا ارسال داده است. مشکل اینجاست که کتابخانههای داخلی زبانهایی مثل جاوا یا پایتون معمولاً به یک زبان خاص وابستهاند و مسائل امنیتی جدی هنگام بازسازی اشیا ایجاد میکنند. راهحل جایگزین، استفاده از فرمتهای مستقل از زبان است، اما این کار نیازمند تبدیل ساختار حافظه به توالی بایتهاست که به آن رمزگذاری (encoding) میگویند؛ فرآیندی که دادهها را به فایلی قابل ذخیره یا ارسال تبدیل میکند.
دومین چالش، استفاده از فرمتهای متنی مثل جیسون است. این فرمتها خوانا هستند اما در نگهداری دقیق اعداد بزرگ یا دادههای باینری ضعف دارند و حجم زیادی اشغال میکنند. برای سیستمهای داخلی سازمان، فرمتهای باینری مبتنی بر اسکیما مانند پروتکل بافر یا پروتباف (Protocol Buffers) مطرح میشوند که با حذف نام فیلدها و استفاده از تگهای عددی، حجم داده را به شدت کاهش میدهند و قابلیت نگهداری (maintainability) سیستم را بهبود میبخشند.
سومین ایده کلیدی، مدیریت تکامل اسکیماست. وقتی برنامهها رشد میکنند، فیلدهایی اضافه یا کم میشوند و نسخههای قدیمی و جدید کد همزمان اجرا میشوند. در پروتباف یا تریفت، با استفاده از تگهای عددی، کدهای قدیمی میتوانند فیلدهای جدیدی را که نمیشناسند نادیده بگیرند تا سازگاری رو به جلو (forward compatibility) حفظ شود، و کدهای جدید نیز میتوانند دادههای قدیمی را بخوانند تا سازگاری رو به عقب (backward compatibility) برقرار بماند.
چهارمین رویکرد، استفاده از فرمت آپاچی آوورو (Apache Avro) است که برخلاف پروتباف، هیچ تگ عددی در داده ذخیره نمیکند و کوچکترین حجم را میسازد. آوورو برای خواندن داده به اسکیمای نویسنده و اسکیمای خواننده متکی است و با تطبیق نام فیلدها، تغییرات اسکیما را بدون نیاز به بازنویسی کل دادهها مدیریت میکند. این ویژگی به پایگاه داده کمک میکند تا با وجود تغییرات ساختاری در طول زمان، همچنان قابلیت اعتماد (reliability) خود را حفظ کند.
پنجمین نکته به نحوهٔ جریان دادهها در سرویسها و پیامرسانها مربوط میشود. در معماری میکروسرویسها، درخواستها و پاسخها بین سرویسها رد و بدل میشوند و به کارگیری فرمتهای سازگار به ما اجازه میدهد سرورها را طی یک ارتقای غلتکی (rolling upgrade) بهروزرسانی کنیم؛ یعنی گرهها را یکییکی آپدیت کنیم بدون اینکه سرویس قطعی داشته باشد.
پیشنهاد من به عنوان میزبان این است که در پروژههای واقعی، هرگز به سریالسازی پیشفرض زبانها اعتماد نکنید و برای دادههای داخلی سازمان حتماً از فرمتهای باینری اسکیمامحور بهره ببرید تا در زمان تغییرات ساختاری دچار بحران نشوید.
امیدوارم این نگاه دقیقتر به رمزگذاری دادهها به شما کمک کند تا برنامههای انعطافپذیرتری بسازید. تا برنامهای دیگر و بررسی بخشی دیگر از دادههای مقیاسپذیر، روزگارتان خوش.