دربارهٔ این فصل
یادداشتِ همراه نوارتا حالا به این فکر کردید که چطور اپلیکیشنهای امروزی تراکنشها، پیامها و رفتارهای ما را در همان لحظه و بدون معطلی تحلیل میکنند، در حالی که حجم دادهها هر لحظه بیشتر میشود؟ این مسئله به یکی از بنیادیترین چالشهای مهندسی نرمافزار تبدیل شده است که سیستمهای توزیعشده با آن دستوپنجه نرم میکنند. در کتاب «طراحی برنامههای دادهگرا» نوشتهٔ «مارتین کلپمن»، فصل یازدهم به همین موضوع اختصاص دارد و نشان میدهد چطور میتوانیم دادهها را به شکل جریانهای بینهایت پردازش کنیم.
برای درک بهتر پردازش جریانی (Stream processing)، یعنی پردازش پیوستهٔ رویدادها همزمان با تولید آنها، باید بدانیم برخلاف پردازش دستهای (Batch processing) که با فایلهای محدود و مشخص سر و کار دارد، دنیای واقعی پر از دادههای پایانناپذیر است. وقتی کاربران مدام در حال تولید داده هستند، تقسیم کردن مصنوعی دادهها به بازههای روزانه یا ساعتی باعث تاخیر زیادی میشود. در اینجا سیستمهای پیامرسان با چالش مدیریت مصرفکنندههای کند روبهرو میشوند؛ اگر تولیدکننده سریعتر از مصرفکننده پیام بفرستد، سیستم باید بین حذف پیامها، صفبندی در حافظه، یا اعمال کنترل جریان یکی را انتخاب کند.
یکی از روشهای کلاسیک برای تبادل پیام، استفاده از کارگزار پیام (Message broker) است که مانند یک پایگاه دادهٔ بهینهشده برای جریان پیامها عمل میکند. کارگزارها معمولاً پس از تحویل موفق پیام به مصرفکننده، آن را پاک میکنند که این رویکرد برای ذخیرهسازی بلندمدت مناسب نیست. در عوض، رویکرد مبتنی بر لاگ (Log-based message broker) مانند آپاچی کافکا، رویدادها را به صورت دنبالهای الحاقی روی دیسک ذخیره میکند تا چندین مصرفکننده بتوانند مستقل از هم، دادهها را بخوانند بدون اینکه نگران پاک شدن پیامها باشند.
ارتباط عمیقی بین پایگاههای داده و جریانها وجود دارد که نمونهٔ بارز آن تغییر دادههاست. مکانیزم تغییر دادهها یا سیدیسی (Change Data Capture) راهی است که تمام تغییرات نوشتهشده در یک پایگاه داده را به شکل یک جریان استخراج میکند تا سیستمهای دیگر مانند ایندکسهای جستجو یا کشها همیشه بهروز بمانند. این الگو کمک میکند تا از خطاهای رایج ناشی از نوشتن همزمان در چند سیستم جلوگیری شود و یک پایگاه داده به عنوان منبع حقیقت عمل کند.
در بحث پردازش جریانها، زمان یکی از پیچیدهترین ابعاد است که باید بین زمان رویداد و زمان پردازش تفاوت قائل شویم. وقتی رویدادها به دلیل تاخیر شبکه یا قطعی اینترنت دیرتر میرسند، سیستم باید با این رویدادهای جا مانده کنار بیاید و پنجرههای زمانی را مدیریت کند. انواع پنجرهها مانند پنجرهٔ غلتان برای تقسیم زمان به بازههای ثابت بدون همپوشانی، به ما کمک میکنند تا تحلیلهای آماری دقیقی روی دادههای در حال حرکت انجام دهیم.
پیشنهاد عملی من این است که وقتی معماری سیستمهای خود را طراحی میکنید، به جای تکیه صرف بر وضعیتهای تغییرپذیر پایگاه داده، به رویدادها به چشم حقایق تغییرناپذیر نگاه کنید. ثبت تغییرات به صورت لاگهای الحاقی به شما اجازه میدهد در صورت بروز خطا، دادهها را دوباره پخش کنید و نماهای خواندنی جدید بسازید بدون اینکه نگران آسیب دیدن دادههای اصلی باشید.
امیدوارم این روایت از کتاب طراحی برنامههای دادهگرا برای شما مفید بوده باشد و دید بهتری نسبت به مدیریت جریان دادهها در سیستمهای مقیاسپذیر پیدا کرده باشید.