Scalability & Performance
القلب اللي بيفرّق بين developer و senior engineer. ازاي تخلي السيستم أسرع و يستحمل millions.
Caching
ازاي تخلي السيستم أسرع 100 مرة
السيناريو
عندك تطبيق فيه صفحة "Trending Products". الصفحة دي بتظهر لكل يوزر يدخل الموقع. كل مرة، الـ database بتعمل query معقدة بتحسب الترتيب من ملايين الـ products.
المشكلة: لو 100 ألف يوزر دخلوا الصفحة في دقيقة، الـ database هتعمل نفس الـ query 100 ألف مرة. السيرفر هيقع.
الحل؟ نحسب النتيجة مرة واحدة، نخزنها، و نخدم الكل من النسخة المخزنة.
ايه هو الـ Cache؟
الـ Cache هو layer وسيط بين التطبيق و الـ database. بيخزن البيانات اللي بتتطلب كتير في memory سريعة جداً (RAM).
الـ Cache أسرع 100 مرة من الـ Database
Cache Hit vs Cache Miss
لما التطبيق يطلب بيانات، فيه احتمالين:
Cache Hit
البيانات موجودة في الـ cache. ترجع فوراً. الـ database مش بيتشاف.
Cache Miss
البيانات مش موجودة. لازم نروح للـ database، نجيبها، و نحطها في الـ cache للمرة الجاية.
استراتيجيات الـ Caching
فيه طرق مختلفة للـ caching، كل واحدة ليها use case:
1. Cache-Aside (Lazy Loading)
التطبيق بيدور في الـ cache أولاً. لو ملقاش، يجيب من الـ database و يحط في الـ cache.
الأشهر و الأبسط. مناسب لمعظم الحالات.
2. Write-Through
أي write بيحصل، التطبيق بيكتب في الـ cache و الـ database في نفس الوقت.
consistency أفضل، بس writes أبطأ.
3. Write-Behind (Write-Back)
Writes تروح للـ cache فوراً، و الـ cache يكتب في الـ database لاحقاً.
writes أسرع، بس فيه risk لو الـ cache وقع.
4. Refresh-Ahead
الـ cache بيحدّث نفسه قبل ما البيانات تـ expire، عشان دايماً تكون fresh.
مناسب للبيانات اللي بتتطلب باستمرار.
Cache Invalidation: أصعب جزء
فيه مقولة شهيرة في الـ computer science:
- Phil Karlton
المشكلة: لو الـ data في الـ database اتغيرت، لازم الـ cache يعرف. لو ما عرفش، اليوزر هيشوف بيانات قديمة.
المنتج سعره 100 جنيه، و في الـ cache. غيرت السعر لـ 150 في الـ database. لكن الـ cache لسه فيه 100. اليوزر يدخل، يشوف 100، يشتري. خسرت فلوس.
الحلول:
- • TTL (Time to Live): كل entry في الـ cache تـ expire بعد فترة (مثلاً 5 دقايق)
- • Manual Invalidation: لما تعدل البيانات، تمسح الـ cache
- • Write-Through: الـ cache بيتحدث مع كل write
مستويات الـ Caching
الـ caching بيحصل في كذا مستوى مختلف:
المتصفح بيحفظ صور و CSS و JS. بيقلل الـ requests للسيرفر.
السيرفرات الـ edge بتخزن المحتوى الثابت. (اتكلمنا عنها في المرحلة 1)
الأشهر. بنخزن نتائج queries، sessions، rate limits.
الـ database نفسها فيها cache داخلي للـ queries المتكررة.