لذت برنامه نویسی: ذخیره سازی داده

اینم یه تجربه پراکنده دیگه!

مدتی هست که دوست دارم بنویسم و نمیرسم. حالا بعد از مدتها اشتیاق به نوشتن اونقدر زیاد هست که دارم مینویسم.

هدف از این پست معرفی روندها ذخیره سازی دیتا توی کد هست. بارها میشه که ما دوست داریم یه اطلاعاتی رو ذخیره کنیم و اون رو بعدا بازیابی کنیم. وقتی سطح پایین با این اطلاعات برخورد میشه معمولا مساله عجیبی هستند و بایستی به روش مناسب اونها رو پیاده سازی کرد تا ویژگی‌های زیر رو داشته باشه.

  1. سایز دیتا و فایل متغیر باشه و بشه اون رو اضافه کرد
  2. فیلدهای دیتا قابل اضافه و کم کردن باشه
  3. حجم کد لازم برای این کار کم باشه که بشه روی دستگاه‌های سطح پایین مختلف ازش استفاده کرد.

راه حل‌ها

چیزهایی که من با توجه به جستجوهام پیدا کردن اینها هستن:

  1. پیاده‌سازی از اول: یعنی وابسته به نیازمون یه ساختار قابل افزایش خوب پیاده‌سازی کنیم
  2. استفاده از فرمت‌های متنی: فرمت‌های متنی که معمولا میشه استفاده کرد ini, xml, cvs, json, yaml هست. ایراد اینها اینه که چون متن هستن حجم زیادی میگیرن و عملا به صرفه نیستن. معمولا میزان پردازش لازم برای parse اونها هم کم نیست.
  3. استفاده از تکنولوژی های serialization مثل protocol buffer, thrift هست که با استفاده از اونها میتونید یه دیتا رو توصیف کنید و همون دیتا رو بصورت آرایه ذخیره کنید. اونها معمولا از schema evolution یعنی تغییر ساختار دیتا هم پشتیبانی می‌کنن.
  4. استفاده از دیتابیس های سبک مانند sqlite
  5. استفاده از کتابخانه‌های ذخیره سازی nosql مثل unqlite یا level db یا berkeley db که هر کدومشون به ما امکان ذخیره سازی دیتای با فرمت نامشخص رو میدن.

انتخاب من

من در پروژه‌هام از یه ساختار با سایز مشخص، ini ، sqlite و unqlite استفاده کردم. الان ترجیحم استفاده از با این اولویت هست:

  1. اول sqlite چون خیلی امکانانت سطح بالایی میده
  2. استفاده از unqlite و یا ini. البته با ini ما به مشکلات زیادی خوردیم اما unqlite رو هم اونقدر توی فیلد تست نکردم
  3. تهش پیاده کردن ساختار با سایز مشخص هست که کلی دردسر داره

همین

لذت برنامه نویسی: پروتکل ارتباطی ما بین ماشین‌ها

این یه تجربه پراکنده دیگه!

یه جاهایی لازم میشه که شما یه سری داده رو بین دوتا کامپیوتر ارسال کنی و یا یه فانکشن رو صدا بزنی. یکی از معمول ترین روش‌های این کار اینه که شما یه وب سرویس بالا بیاری و با json یا xml یا yaml اطلاعات رو ارسال کنی. اما این روش دوتا ایراد داره. اول اینکه مجبوری از پروتکل وب استفاده کنی یعنی یه وب سرور همیشه اجرا هست. همچنین parse کردن html تقریبا کار پرهزینه‌ای هست. پس شرکت‌های بزرگ مثل گوگل و فیسبوک به این نتیجه رسیدن که داده‌ها رو به یه فرمت استاندارد serialize کنن و بعد ارسال کنن و در نظر داشته باشن که این پروتکل‌های ارتباطی در طول زمان کامل میشن پس باید ماشین‌ها بتونن با نسخه‌های قدیمی تر با نسخه‌های جدید تر حرف بزنن. به همین خاطر یه سری کتابخانه ایجاد کردن که شما با اونها می‌تونید پروتکل خودتون رو طراحی کنید و توی زبان‌های مختلف ازش استفاده کنید. اینجا من سعی میکنم لیست این کتابخانه‌ها و یه توضیح تو دل برو غیر دقیق ازشون ارائه بدم تا اگه نیاز داشت سرنخ رو بگیره و ادامه بده!

  1. protocol buffer: این کتابخانه در گوگل طراحی شده و استفاده میشه که خروجی به زبان‌های c++ و جاوا و پایتون داره. به زبان‌های دیگه هم پورت شده اما حجم زیاد کد تولید شده و بهینه نبودن مصرف حافظه ایراد‌هایی هست که بهش میگیرن
    1. nanopb: یک پیاده‌سازی مجدد هست که سعی کرده حجم کد تولید شده کوچک باشه
  2. thrift: این کتابخانه در فیسبوک طراحی و استفاده شده. این کتابخانه خیلی شبیه protocol buffer هست با این تفاوت که لایه ارسال و دریافت این اطلاعات رو هم شامل میشه
  3. cap’n proto: این کتابخانه توسط نویسندگان کتابخانه گوگل که فکر کنم دیگه توی گوگل کار نمیکنن باز طراحی شده که در طراحیش سعی شده بسیار سریع باشه
  4. flatbuffers: این کتابخانه باز اخیرا توسط گوگل طراحی شده که مشکلات سرعت و مصرف حافظه protocol buffer رو نداشته باشه. همچنین بسیار سریع باشه که خودشون ادعا میکنن توی نوشتن بازی هم به درد میخوره
  5. apache avro: کتابخانه‌ای هست که برای ارتباط بین نود‌های hadoop طراحی شده

امیدوارم این سرنخ کوتاه به درد دیگران هم بخوره!

همین!