المقدمة
جزء كبير من عالم صناعة البرمجيات اليوم مبني على صناعة وتقديم APIs للناس لاستخدامها وجزء كبير من نجاح أو فشل ال APIs مبني على أدائها وسرعتها فورقة وقلم وتعالوا نتكلم عن ازاي نحسن ال API Performance.

Cache
استخدام الـ Cache يعتبر من أهم طرق تحسين أداء الـ API, لأنها بتقلل عدد الطلبات المتكررة لل Server وبتسرّع الاستجابة ودا لأن:
- طلب البيانات من الـ Database بياخد وقت كبير, تخزين بيانات الطلبات المتكررة هيوفرها للمستخدم اللي طلبها وكذلك لمستخدمين اخرين بنفس الطلب وبسرعة عالية جدًا
- كمان ال Cache بيخفف الضغط على قاعدة البيانات ففي حالات الضغط العالي (زي الجمعة البيضاء و غيرها) بيمنع الServer من الانهيار ويضمن استمرارية الخدمة
في حلول كثيرة لتطبيق ال Cache و في أكثر من Layer في الSystem تقدر تطبق فيها ال Cache.
لو حابب تقرأ أكثر عن الموضوع فعلى موقعنا ورقات ومقالات كثير بتتكلم عنه.

Top 6 Caching Strategies

Deep Dive Into Caching Strategies
Simplify Database Queries
كلنا عارفين إن ال Database calls مكلفة بشكل عام وعشان كدا غالبًا بنتفاداها بال Cache, ولكن كتير مننا بينسى يعمل Query Optimization ودا بيأثر بشكل ملحوظ خصوصًا في ال Queries المعقدة.فكل ما الQuery يبقى أبسط، كل ما قاعدة البيانات ترد أسرع، وبالتالي المستخدم ياخد نتيجة أسرع.
راجع كدا مًبرمجنا الفاضل كام (*) في Queries مشاريعك علي ال Production هل محتاج كل ال Columns فعلاً, استخدام Indexes وتجنب ال N+1 Queries واستبدال ال Joins المعقدة بتحسين ال Schema بشكل أفضل كل دي بتساعدك على تحسين الأداء.

Improving SQL Queries Performance Tips & Tricks

Indexing - Query Plan and Performance Optimization
Pagination
بعض الطلبات ممكن ترجع Responses كبيرة جدًا كمثال لما بتفتح موقع تسوق فيه ملايين المنتجات, إنك تقوم بإرسال كل المنتجات للعميل في مرة واحدة دا هيكون بطئ جدًا ولذلك بنقسم النتيجة لصفحات وبنرد على ال Request الواحد بعدد معين من المنتجات لو ال Client طلب ثاني بنقدمله الصفحة التالية أو العدد التالي من المنتجات وهكذا.
ال Pagination بنقدر ننفذه بأكثر من طريقة أشهر طريقتين هما :
- Offset-based : استخدام Limit & Offset
- Cursor-based: استخدام Cursor & next_token
Compress Payloads
الـ Compress Payloads يعني إننا نضغط البيانات اللي رايحة أو جاية من الـ API علشان حجمها يبقى أصغر. الفكرة بسيطة: لما حجم البيانات يقل، سرعة النقل بتزيد، وده بيخلي استجابة الـ API أسرع بكتير. ودا مهم خصوصًا لما الServer يكون بيتعامل مع عدد كبير من المستخدمين أو بيرجع بيانات ضخمة زي JSON فيها قوائم طويلة أو معلومات كتير.
أهميته بتبان لما تستخدمه مع تطبيقات موبايل أو شبكات بطيئة، أو حتى مع APIs فيها تفاعل لحظي (Real-Time). الضغط بيقلل وقت الانتظار وبالتالي تحسين تجربة المستخدم.
الطرق الشائعة لتنفيذه هي باستخدام خوارزميات زي Gzip أو Brotli. وتقدر تحققها بسهولة علي ال Server, بس لازم تتأكد إن الClient يقدر يفهم النوع ده من الضغط، وده بيتم باستخدام Header زي Accept-Encoding و Content-Encoding.
باختصار، ضغط البيانات خطوة بسيطة لكن فعالة جدًا لتحسين أداء الـ API وتقليل التحميل على الشبكة والسيرفر.
Connection Pool
استخدام Connection Pool يعني إنك بتجهّز مجموعة من ال Connection بقاعدة البيانات تكون جاهزة طول الوقت بدل ما تفتح وتقفل اتصال جديد في كل طلب API. ليه؟ لأن فتح الاتصال بحد ذاته بياخد وقت ومجهود من السيرفر، وده بيأثر على الأداء لما عدد الطلبات يزيد. الـ Pool بيسهّل الموضوع عن طريق إعادة استخدام الاتصالات اللي خلصت بدل ما ينشئ اتصال جديد من الصفر.
الميزة الكبيرة إنك بتحدد عدد الاتصالات اللي تقدر تتفتح في نفس الوقت، وده بيمنع إنك تحط قاعدة البيانات تحت ضغط عالي. كمان الـ Pool بينظم الطلبات وبيقلل استهلاك الموارد.

Database Connection Pool
Rate Limiting
ال Rate Limiting بنستخدمه بشكل أساسي لحماية الخدمة من سوء الاستخدام أو Usage Abuse.
دا بيمنع محاولات الـ DOS Attacks مثلاً وهي إغراق آل Service بالطلبات و ب Traffic عالي جدًا متقدرش عليه من مستخدم واحد أو Bot ودا بيسبب Resource Starvation و بيأثر علي ال API Performance لباقي المستخدمين.
وهي مش المثال الوحيد ممكن مبرمج عمل خطأ برمجي خلي الClient الخاص بيه يدخل في Feedback loop أو Retrier ويبعث كم مهول من ال Requests علي ال API عن طريق الخطأ. فال Rate limiting بيمنع ده من خلال تحديد عدد Requests معينة مسموح للمستخدم يطلبها في فترة زمنية محددة.
وكمثال لما بتطلب أكل في مطعم وفي حد قدامك طالب ٥٠ ساندوتش 😄 دا بيمنع بقية العملاء من الطلب بينما لو المطعم حدد حد أقصي لكل عميل دا هيضمن وصول الخدمة للكل.

Deep Dive Into Rate Limiting

Rate Limiting In a Nutshell
Content Delivery Networks (CDNs)
الـ CDN هو شبكة من ال Servers موزعة حول العالم بتخزن نسخ مؤقتة من المحتوى بتاعك علشان توصله للمستخدم من أقرب مكان ليه جغرافيًا. استخدام CDN بيحسّن أداء الـ API بشكل كبير، خصوصًا لو فيه صور، ملفات ثابتة (static files)، أو responses شبه متكررة. بدل ما كل طلب يروح لServer رئيسي بعيد، ال CDN بيرد عليه بسرعة من أقرب نقطة لو ملقاش الرد متخزن عنده وقتها بيوجّه الطلب لل Server الرئيسي.
الميزة كمان إن الـ CDN بيخفف الضغط على ال Server الرئيسي، فتقدر تخدم عدد مستخدمين أكثر من غير ما الSystem يبطأ أو يقع.
وتقدر تنفّذ CDN بسهولة باستخدام خدمات زي Cloudflare، أو Fastly.
في الختام
شاركونا إيه الطرق الثانية اللي بتعتمدوا عليها عشان تحسنوا من الـ API Performance ونشوفكم في ورقة قادمة باذن الله 👋







Discussion