Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
اگر در سالهای اخیر در مهندسی نرم افزار ، به خصوص سیستمهای سمت سرور و backend کار کرده اید، احتمالا با تعداد زیادی واژه مد روز در زمینههای ذخیره و پردازش دادهها بمباران شده اید. NoSQL، کلان داده، Web-scale، Sharding، Eventual consistency، ACID، تئوری CAP، سرویسهای ابری، MapReduce و Real-Time. در دهه گذشته ما شاهد بهبودهای جالب بسیاری در بانکهای اطلاعاتی، سیستمهای توزیع شده و نحوه ساختن برنامهها با استفاده از آنها هستیم.
برنامههای data-intensive، با استفاده از پیشرفتهای این تکنولوژی ها، مرزهای آنچه که امکان پذیر بوده است را جابه جا کرده اند. ما به برنامه ای data-intensive میگوییم که اگر چالش اصلی آن حجم داده ها، پیچیدگی دادهها و یا سرعت تغییر دادهها باشد و این بر خلاف برنامههای compute-intensive است که سایکلهای CPU گلوگاه هستند.
ابزارها و تکنولوژی هایی که به برنامههای data-intensive در ذخیره کردن و پردازش دادهها کمک میکنند، به سرعت با این تغییرات سازگار شده اند. انواع جدید سیستمهای پایگاه داده «NoSQL»، توجه زیادی را به خود جلب کرده اند، اما صفهای پیام، کش ها، ایندکسهای جستجو، فریمورکها برای پردازش استریم و batch و تکنولوژیهای مرتبط نیز خیلی مهم هستند. برنامههای زیادی هستند که از ترکیب اینها استفاده میکنند.
خوشبختانه، در پشت تغییرات سریع فناوری، اصول ثابتی وجود دارند که عوض نمیشوند و مهم نیست که از چه نسخهی ابزار خاصی استفاده میکنید. اگر آن اصول را خوب بفهمید، شما در موقعیتی قرار میگیرید که ببینید هر ابزاری به درد کجا میخود و چگونه به خوبی از آن استفاده کنید و از مشکلات جلوگیری کنید. این جایی است که این کتاب وارد میشود.
هدف کتاب طراحی برنامههای Data-Intensive، کمک به شما در پیدا کردن مسیر در بین چشم انداز متنوع و به سرعت در حال تغییر فناوریها برای پردازش و ذخیره سازی دادهها است. این کتاب، آموزش یک ابزار خاص نیست و همچنین کتاب درسی پر از تئوری خشک نیست. در عوض ما به مثال هایی از سیستمهای داده موفق خواهیم پرداخت: فناوری هایی که پایه و اساس بسیاری از برنامههای محبوب را تشکیل میدهند و باید نیازمندیهای مقیاس پذیری، کارایی و قابلیت اطمینان را هر روزه تامین کنند.
در ادامه ما وارد جزئیات درون این سیستمها میشویم، الگوریتمهای کلیدی آنها را از هم جدا میکنیم و در مورد اصولشان و مصالحه هایی که انجام داده اند بحث میکنیم. در این سفر ما سعی خواهیم کرد تا روشهای مفید فکر کردن درباره سیستمهای دادهها را پیدا کنیم؛ نه فقط در مورد نحوه کار آن ها، بلکه چرا این گونه کار میکنند و این که چه سوالاتی را باید بپرسیم.
چه کسانی باید این کتاب را بخوانند؟
اگر شما برنامه هایی توسعه میدهید که دارای شکلی از سرور یا backend برای ذخیره سازی یا پردازش داده هاست و برنامههای شما از اینترنت استفاده میکنند (برنامههای تحت وب، برنامههای موبایل یا سنسورهای متصل به اینترنت)، پس این کتاب برای شماست.
این کتاب برای مهندسین نرم افزار، معماران نرم افزار و مدیران فنی که عاشق کد نوشتن هستند، نوشته شده است. اگر احتیاج به تصمیم گیری در مورد معماری سیستمی که بر روی آن کار میکنید دارید، این کتاب مربوط به شماست؛ برای مثال اگر احتیاج به انتخاب ابزارهای مناسب برای حل مساله داده شده دارید و به دنبال این هستید که چگونه آنها را به بهترین شکل به کار برید. اما حتی اگر قادر به انتخاب ابزارهای خود نیستید، این کتاب به شما کمک میکند تا نقاط قوت و ضعف آنها را بهتر بشناسید.
شما باید در ساخت برنامههای مبتنی بر وب یا سرویسهای شبکه دارای تجربه باشید و باید با بانکهای اطلاعاتی رابطه ای و SQL آشنا باشید. دانستن در مورد پایگاه دادههای غیر رابطه ای و یا دیگر ابزارهای مرتبط با داده یک مزیت به حساب میآید، اما ضروری نیست. درک کلی از پروتکلهای رایج مانند TCP و HTTP مفید است. زبان برنامه نویسی یا فریمورک انتخابی شما نیز هیچ تفاوتی برای این کتاب ندارد.
اگر هر یک از موارد زیر برای شما صادق است، این کتاب برای شما ارزشمند خواهد بود:
- می خواهید نحوه مقیاس پذیر کردن سیستمهای داده را یاد بگیرید؛ برای مثال، برای پشتیبانی وب یا برنامههای موبایل با میلیونها کاربر.
- شما میخواهید برنامهها را بسیار در دسترس کنید (به حداقل رساندن زمان از کار افتادگی) و از لحاظ عملیاتی قوی.
- شما به دنبال راههای سادهتر کردن نگه داری سیستمها در طولانی مدت هستید، حتی وقتی که رشد میکنند و نیازمندیها و تکنولوژی هایشان تغییر میکنند.
- شما درباره اینکه چیزها چگونه کار میکنند کنجکاو هستید و میخواهید بفهمید که در درون وبسایتها و سرویسهای بزرگ چه خبر است.
بعضی وقت ها، هنگام بحث در مورد سیستمهای داده مقیاس پذیر، افرادی هستند که کامنت میدهند که «شما گوگل یا آمازون نیستید. نگرانی درباره scale را کنار بگذارید و از یک پایگاه داده رابطه ای استفاده کنید.». حقیقتی در آن جمله است: ساختن برنامه برای scale پذیر بودن وقتی که احتیاجی به آن ندارید، موجب هدر رفتن زمان و هزینه میشود و شما را درگیر یک طراحی غیر قابل انعطاف میکند. در واقع این نوعی بهینه سازی زودرس است. با این حال، مهم است که ابزار مناسب را برای کار انتخاب کرده و فناوریهای مختلف نیز نقاط ضعف و قوت خودشان را دارند. همان طور که خواهیم دید، پایگاه دادههای رابطه ای مهم هستند ولی حرف آخر در مورد کار با دادهها نیستند.