کش و CDN: چرا بار دومی که یه سایت رو باز میکنی سریعتره
ببین چرا یه صفحه بار اول کند لود میشه و بلافاصله بعدش سریع، کش مرورگرت و یه CDN هر کدوم چی رو نزدیک تو نگه میدارن، و چرا hard refresh بعضی وقتا راهحل یه صفحهی قدیمیِ گیرکردهست.
چرا فاصله مهمه
فاصله وقت میگیره، برای همین کپیها رو نزدیکتر نگه میدارن
هم درخواست هم جوابش باید فیزیکی یه مسیر رو طی کنن، و هیچی سریعتر از نور حرکت نمیکنه؛ حتی با اون سرعت، یه رفتوبرگشت تا سروری تو یه قارهی دیگه یه زمان واقعی و محسوس اضافه میکنه. برای همین بهجای اینکه هر درخواست تنها اون سفر رو بره، سیستمها یه کپی از فایلها رو تو نقطههای نزدیکتر به تو نگه میدارن، و هر جا بشه همون کپی رو تحویل میدن.
یه عکس تو یه سایت پرطرفدار هر بار که یهمیلیون نفر نگاهش میکنن از یه کامپیوتر دورافتاده گرفته نمیشه. یه کپیش خیلی نزدیکتر به بیشترشون نشسته.
خودت رو امتحان کن
نیلوفر امروز برای اولین بار یه صفحه رو باز میکنه و بهوضوح بیشتر از بار دومی که یه دقیقه بعد بازش میکنه طول میکشه تا لود بشه. محتملترین دلیلش چیه؟
- بار اول درخواست تا یه سرور دور رفت؛ بار دوم یه کپی نزدیکتر جواب داد
- گوشیش تو همون یه دقیقه سریعتر شده
- صفحه بار دوم ساده اندازهش کوچیکتره
- شرکت اینترنتش بعد از بار اول بهش یه سرعت اضافه میده، برای همین بقیهی دفعهها سریعتر باز میشه
جواب رو ببین
بار اول درخواست تا یه سرور دور رفت؛ بار دوم یه کپی نزدیکتر جواب داد
درسته. بار اول معمولاً چیزی نزدیک نیست که جواب بده، پس اون سفر طولانی رو میره. وقتی یه کپی نزدیکتر بهش هست، بار دوم دیگه لازم نیست اون سفر رو تکرار کنه.
دو جور «نزدیکتر» که فرق دارن
کش مرورگر
رو خودِ دستگاه تو زندگی میکنه. فقط خودت ازش استفاده میکنی. کپی فایلهای سایتهایی که خودت قبلاً دیدی رو یه مدت نگه میداره.
نود CDN
نزدیک شهر تو زندگی میکنه، یا خود سایت ادارهش میکنه یا یه شبکهی توزیع محتوا. بین همهی آدمای نزدیک شریکه. کپیهایی رو نگه میداره که سایت از قبل، پیش از اینکه تو اصلاً بازدید کنی، فرستاده.
خودت رو امتحان کن
یه نود CDN نزدیک شهرت فقط بعد از اینکه خودت شخصاً یه فایل رو درخواست کردی شروع میکنه کپیشو نگه داره؛ نمیتونه قبل از اولین بازدید خودت چیزی آماده داشته باشه.
جواب رو ببین
نادرست
غلطه. خیلی وقتا سایتها از قبل کپیها رو به نودهای CDN میفرستن، یا یه نود اولین باری که هر کسی نزدیکش درخواست میده کپی رو نگه میداره، نه فقط خود تو. به هر حال، خیلی از چیزی که CDN بهت میده اصلاً بهخاطر درخواست خودت گرفته نشده.
قدمبهقدم ببین

درخواست اول تا خود مبدأ میره درخواست اول کل مسیر خاکستری رو طی میکنه: از گوشی، از کنار یه نود نزدیک که هنوز هیچی نداره رد میشه، و تا مبدأ که خیلی دوره میره. نوار نارنجی پایین، 180 ms، یعنی همین سفر کامل چقدر طول کشیده.

تو راه برگشت، نود نزدیک یه کپی نگه میداره همونطور که جواب از همون مسیر برمیگرده، به شکل یه نقطهی نارنجی، نود نزدیک بنفشکمرنگ میشه و یه آیکون کوچیک فایل بالاش ظاهر میشه: تازه یه کپی از چیزی که برگشته رو برای خودش نگه داشته، که دفعهی بعد لازم نباشه دوباره از مبدأ بپرسه.

درخواست دوم فقط تا نود میره درخواست دوم، به رنگ آبی، فقط تا همون نود نزدیک میره؛ اصلاً لازم نیست تا مبدأ دور برسه، چون نود از قبل یه کپی داره. نوار جدید پایین، 20 ms، خیلی کوتاهتر از 180 ms سفر اوله.

بار سوم، خودِ گوشی جواب میده تا بار سوم، یه آیکون فایل داخل خودِ گوشی نشسته: کش خودِ مرورگر از قبل یه کپی داره، پس اصلاً لازم نیست چیزی هیچجا سفر کنه. نوار سوم یه خط نازک بنفشکمرنگه، نزدیک 0 ms.
خودت رو امتحان کن
با نگاه به اون سهتا نوار، 180 ms، بعد 20 ms، بعد نزدیک 0 ms، هر تا افت واقعاً نشوندهندهی چیه؟
- خود اینترنت تو همون چند دقیقه سریعتر شده، برای همین هر سفر روش کمتر طول کشیده
- درخواست هر بار مسافت کوتاهتری رفته، تا جایی که آخرش اصلاً جایی نرفته
- کوچیکتر شدن صفحه هر بار که درخواست میشه
- سریعتر شدن پردازندهی خودِ گوشی
جواب رو ببین
درخواست هر بار مسافت کوتاهتری رفته، تا جایی که آخرش اصلاً جایی نرفته
درسته. هر نوار کوتاهتر یعنی همون درخواست فاصلهی کمتری طی کرده: بار اول تا خود مبدأ، بعد فقط تا نود نزدیک، بعد اصلاً هیچجا، چون گوشی خودش کپی داشته.
وقتی کپی اشتباهه
چرا hard refresh یه صفحهی قدیمیِ گیرکرده رو درست میکنه
کل هدف یه کش اینه که کپی قدیمی رو بهت بده بهجای اینکه دوباره بپرسه، که سریعه، ولی گاهی اشتباهه: سایت عوض شده و کشت هنوز خبر نداره. یه رفرش معمولی اغلب همون فایلهای کششده رو دوباره استفاده میکنه. یه hard refresh به مرورگر میگه از کشش رد بشه و دوباره از خود مبدأ بپرسه، و پاک کردن کش کاملاً خالیش میکنه، که درخواست بعدی مجبور بشه کپی تازهی همهچیز رو بگیره.
یه قیمت قدیمی رو تو صفحهای میبینی که میدونی تازه عوض شده. یه hard refresh، معمولاً با Ctrl/Cmd+Shift+R، یه گرفتن تازه رو مجبور میکنه و قیمت جدید ظاهر میشه.
خودت رو امتحان کن
هر راهحل رو تو گروهی که واقعاً کارش همونه بذار
- همون چیزی که تو کش هست رو دوباره استفاده میکنه، پس یه کپی قدیمی میتونه قدیمی بمونه
- از کش رد میشه و دوباره از خود مبدأ میپرسه
- معمولاً سریعترین گزینهست وقتی واقعاً چیزی عوض نشده
- کار درست وقتیه که میدونی صفحه عوض شده ولی هنوز نسخهی قدیمی رو میبینی
- فایلهای قدیمی رو کاملاً خالی میکنه که بازدید بعدی همهچیز رو تازه بگیره
- برای صفحهای که همین امروز اولین بار بازش میکنی کافیه
جواب رو ببین
رفرش معمولی: همون چیزی که تو کش هست رو دوباره استفاده میکنه، پس یه کپی قدیمی میتونه قدیمی بمونه, معمولاً سریعترین گزینهست وقتی واقعاً چیزی عوض نشده, برای صفحهای که همین امروز اولین بار بازش میکنی کافیه
hard refresh یا پاک کردن کش: از کش رد میشه و دوباره از خود مبدأ میپرسه, کار درست وقتیه که میدونی صفحه عوض شده ولی هنوز نسخهی قدیمی رو میبینی, فایلهای قدیمی رو کاملاً خالی میکنه که بازدید بعدی همهچیز رو تازه بگیره
سود بزرگش
چرا یه ویدیو خوب کار میکنه با اینکه سرورهاش دورن
یه سایت ویدیو ویدیوی همه رو از یه ساختمون دور پخش نمیکنه. ویدیوهای پرطرفدارش از قبل، یا بعد از اینکه چندتا نفر اول درخواستش میدن، کپی میشن تو نودهای CDN تو شهرهای مختلف دنیا. تقریباً هیچوقت مستقیم با سرورهای اصلی و دورِ خود سایت حرف نمیزنی؛ با یه نودی حرف میزنی که شاید فقط یه پرش کوتاه از شهر خودت فاصله داره، و همون ویدیوی موردنظرت رو داره.
یه نفر تو تهران که داره ویدیوی یه شرکتی رو میبینه که دفتر مرکزیش تو یه قارهی دیگهست، به احتمال زیاد داره از یه نودی خیلی نزدیکتر به خودش پخش میکنه، نه از اون ساختمون دوردست.
خودت رو امتحان کن
- یلدا همون دقیقهای که یه ویدیوی خیلی پرطرفدار منتشر میشه، پخشش میکنه؛ چند ثانیهی اول بافر میزنه و تیکهتیکه پخش میشه.
- یه ساعت بعد، همسایهی یلدا همون ویدیو رو پخش میکنه و بدون هیچ بافری، همون لحظه شروع میشه.
محتملترین دلیل روونتر بودن تجربهی همسایه چیه؟
- گوشی یلدا از گوشی همسایهش ساده ضعیفتره
- تا وقتی همسایه پخش میکنه، یه نود CDN نزدیک احتمالاً از قبل یه کپی از اون ویدیو داره، درحالیکه درخواست یلدا شاید بین اولینهایی بوده که هنوز باید دورتر میرفت
- شرکت ویدیو عمداً ویدیوهای جدید رو کند میکنه
- ویدیوها همیشه همون روز انتشار بدتر پخش میشن، فرقی نداره
جواب رو ببین
تا وقتی همسایه پخش میکنه، یه نود CDN نزدیک احتمالاً از قبل یه کپی از اون ویدیو داره، درحالیکه درخواست یلدا شاید بین اولینهایی بوده که هنوز باید دورتر میرفت
دقیقاً. درست بعد از انتشار، ممکنه یه نود نزدیک هنوز کپی نداشته باشه، پس بعضی درخواستهای اول باید دورتر برن، نزدیکتر به مبدأ. یه ساعت بعد، اون نود بهاحتمال زیاد از قبل، از موج آدمایی که وسط این فاصله دیدنش، یه کپی گرفته.
مرور درس
- فاصله وقت میگیره، برای همین سیستمها بهجای اینکه هر بار از راه دور بگیرن، یه کپی نزدیکتر به تو نگه میدارن.
- کش خودِ مرورگرت رو دستگاه خودته؛ یه نود CDN نزدیک شهرته و به همهی اطرافیانت خدمت میده.
- بار اول اغلب تا خود مبدأ میره؛ بازدیدهای بعدی رو یه کپی نزدیکتر جواب میده، و هر قدم سریعتر میشه.
- hard refresh یا پاک کردن کش از کپیهای قدیمی رد میشه و یه گرفتن تازه رو مجبور میکنه، که همون راهحل یه صفحهی قدیمیِ گیرکردهست.