المقدمة
لما نيجي نتكلم عن الأنظمة اللي بتركز على عمليات القراءة أكتر من الكتابة، يعني الـ Systems اللي بيكون فيها نسبة قراءة للبيانات أكبر بكتير من نسبة الكتابة.
فلو كان الـ System اللي بتبنيه بيتضمن من المتطلبات بتاعته انه يكون Read Heavy ففيه شوية استراتيجيات ممكن نستخدمها عشان نحسن من الأداء ونضمن إن النظام يشتغل بكفاءة عالية.
فورقة وقلم وتعالوا نتكلم عن بعض الاستراتيجيات اللي ممكن نستخدمها.
Caching
أول استراتيجية وأكتر واحدة مشهورة هي الـ Caching. وفكرة الـ Caching ببساطة هي إنك بتحتفظ بنسخة من البيانات اللي بتتقرا كتير في مكان سريع زي الـ RAM فبالتالي البيانات دي بتكون In-Memory.
لما المستخدم بيطلب البيانات دي تاني، النظام بدل ما يروح يجيبها من الـ Database، ويكون فيه Latency نتيجة قراءة البيانات دي من الـ Disk بيجيبها علطول من الـ Cache.
فده طبعًا بيقلل الوقت اللي الـ System محتاجه علشان يجيب البيانات وبالتالي يقلل الحمل على الـ Database.
وفيه أنواع كتير من الـ Caching زي:
- الـ In-Memory Caching: زي استخدام Redis أو Memcached. ده بيكون مفيد لما تكون محتاج الوصول للبيانات بسرعة فائقة.
- الـ Application-Level Caching: في النوع ده بتحتفظ بنسخة من البيانات في الـ Application نفسه، زي لما تعمل Cache لنتائج API Calls.
وكنا عملنا ورقة قبل كده عن الـ Caching Strategies تقدروا تشوفوها من هنا:
![](https://eqraatech.com/content/images/2023/12/Paper-and-Pen--7-.png)
Caching Strategies In a Nutshell
Indexing
الـ Indexing بيساعد في تسريع عمليات البحث في الـ Database. فلما يكون عندنا Table فيها ملايين الـ Records، البحث جواها ممكن ياخد وقت طويل.
لكن لو عاملين Index على الـ Column مثلا اللي بنبحث بيه كتير، هنلاقي إن البحث بقى أسرع بكتير. زي ما يكون عندك فهرس في كتاب، بدل ما تقعد تدور على الكلمة في كل صفحات الكتاب، بتروح للفهرس وتوصل للمعلومة بسرعة.
وطبعًا بنأكد على ان عمل Indexing لازم يتم بعناية وانك تكون فاهم كويس ايه الـ Column اللي فعلا ممكن تحتاج يتعملها Indexing عشان تساعد في تحسين الاداء.
أنواع الـ Indexes:
- الـ B-Tree Index: ده النوع الافتراضي في معظم الـ Databases. بيكون فعال في معظم حالات البحث.
- الـ Hash Index: بيكون أسرع في عمليات البحث عن القيم الدقيقة لكنه مش مفيد في عمليات البحث عن نطاق معين من القيم واللي بيعرف بالـ Range Based Queries.
وفيه أنواع تانية كتير ممكن نعمل عنها ورقة منفصلة، وكنا اتكلمنا برضو عن الـ Indexing قبل كده تقدروا تشوفوا ده من خلال الورقة دي:
![](https://eqraatech.com/content/images/2024/02/----------database-indexing.png)
Database Indexing
تقدروا دلوقتي تشتركوا في النشرة الأسبوعية لاقرأ-تِك بشكل مجاني تمامًا عشان يجيلكوا كل جديد بشكل أسبوعي فيما يخص مواضيع متنوعة وبشروحات بسيطة وسهلة وبجودة عالية 🚀
النشرة هيكون ليها شكل جديد ومختلف عن شكلها القديم وهنحاول انها تكون مميزة ومختلفة وخليط بين المحتوى الأساسي اللي بينزل ومفاجآت تانية كتير 🎉
![](https://eqraatech.com/content/images/2024/06/pen-paper-promo-1.png)
![](https://substackcdn.com/image/fetch/f_auto,q_auto:best,fl_progressive:steep/https%3A%2F%2Feqraatech.substack.com%2Ftwitter%2Fsubscribe-card.jpg%3Fv%3D-1612242264%26version%3D9)
![](https://eqraatech.com/content/images/2024/07/EqraaTech-Cheat-Sheets.png)
Replication
الـ Replication هو إننا نعمل نسخ من الـ Database على أكتر من Server.
الفكرة هنا إننا نوزع عمليات القراءة على السيرفرات المختلفة، فمثلا لو عندنا 3 سيرفرات وكل سيرفر عليه نسخة من الـ Database، ده هيخلينا بدل منكون قادرين نـ Support 1,000 Read Query من Server واحد نـ Support 3,000 Read Queries في نفس الوقت لان باه عندنا 3 Servers.
فبالتالي هنحسن من الـ Read Throughput بالاضافة لاننا ممكن الـ Servers دي تكون قريبة جغرافيا من الـ End Users فتاخد Latency أقل بكتير.
أنواع الـ Replication:
- الـ Leader-Follower Replication: في النوع ده بيكون عندك سيرفر رئيسي (Leader) بيقوم بكل عمليات الكتابة، والسيرفرات التابعة (Followers) بتقوم بعمليات القراءة.
- الـ Multi-Leader Replication: هنا كل السيرفرات بتقدر تعمل عمليات قراءة وكتابة، لكن ده بيكون أعقد في الإدارة عشان نضمن الـ Synchronization بين البيانات وبعضها.
وكنا عملنا ورقة بتتقلم عن الـ Replication تقدروا تشوفوها من هنا:
![](https://eqraatech.com/content/images/2023/12/Paper-and--10-.png)
Replication In a Nutshell
Load Balancing
الـ Load Balancing بيشتغل مع الـ Replication علشان يوزع الـ Traffic بتاع القراءة على السيرفرات المختلفة وبالتالي يقلل الحمل على كل واحد. وبيستخدم خوارزميات متنوعة زي Round Robin أو Least Connections علشان يتأكد إن كل سيرفر بياخد جزء مناسب من الحمل.
وكده بنضمن إن مفيش سيرفر بيتحمل زيادة عن اللزوم والـ System كله بيشتغل بكفاءة عالية.
أمثلة على Load Balancers:
- الـ HAProxy: ودي أداة مفتوحة المصدر بتستخدم في توزيع الحمل بين السيرفرات وبعضهم البعض.
- الـ Nginx: ممكن يستخدم كـ Web Server وبرضو كـ Load Balancer.
- الـ AWS Elastic Load Balancer: ودي بتكون خدمة من Amazon بتستخدم لتوزيع الحمل على السيرفرات اللي في الـ Cloud.
وكنا عملنا ورقة بتتكلم عن الـ Load Balancer تقدروا تشوفوها من هنا:
![](https://eqraatech.com/content/images/2023/12/Paper-and--18-.png)
Load Balancer In a Nutshell
وعملنا ورقة تانية بتتكلم عن خورازميات الـ Load Balancer تقدروا تشوفوها من هنا:
![](https://eqraatech.com/content/images/2023/12/Paper-and--14-.png)
Load Balancer Algorithms In a Nutshell
Sharding
الـ Sharding هو إننا نقسم الـ Database بتاعتنا لأجزاء أصغر ونوزعها على أكتر من سيرفر. فبدل ما يكون عندنا Database كبيرة وضخمة بنبدأ نقسمها لأجزاء صغيرة.
فكل جزء بيحتوي على جزء من البيانات وبيكون مستقل بذاته. فمثلا، لو عندنا Users Table وكبيرة، ممكن نقسمها على حسب الحروف الأبجدية، فكل سيرفر يكون مسؤول عن مجموعة معينة من الحروف. أو مثلًا لو عندنا 4Million Records نخلي كل 1Million في Database منفصلة.
وده طبعًا بيساعد في توزيع الحمل وتحسين الأداء كذلك.
أنواع الـ Sharding:
- الـ Horizontal Sharding: وهنا بنقسم البيانات على حسب الـ Rows زي ما وضحنا في مثال الـ Users وان عندنا 4Million Records ممكن ناخد مثلا أجزاء من كل Row ونحطها في قاعدة بيانات منفصلة أو ناخد كل الـ Users اللي من حرف كذا لحرف كذا.
- الـ Vertical Sharding: بيتم تقسيم البيانات على حسب الـ Columns فمثلا ناخد الـ Email Column نخليه في قاعدة بيانات والـ User Locations في قاعدة بيانات تانية وهكذا.
Content Delivery Network (CDNs)
الـ CDNs هي شبكة من السيرفرات الموزعة جغرافيا، مصممة لتقديم المحتوى للمستخدمين بسرعة وكفاءة.
فلما يكون عندنا موقع أو تطبيق بيستخدم صور، فيديوهات، أو ملفات ثابتة كتير اللي هي Static Content، فاستخدام الـ CDN بيساعد في تسريع تحميل المحتوى ده للمستخدمين.
والسيرفرات دي بتخزن نسخ من المحتوى الثابت ده وتقدمه للمستخدمين من أقرب سيرفر ليهم، وده بيقلل زمن الاستجابة بشكل كبير.
مميزات استخدام الـ CDNs:
- تسريع تحميل المحتوى: بتقلل وقت تحميل الصور، الفيديوهات، والملفات الثابتة بشكل كبير.
- تقليل الحمل على السيرفر الرئيسي: بتساعد في توزيع الحمل على السيرفرات المختلفة بدل من التركيز على سيرفر واحد.
- تحسين تجربة المستخدم: بتساعد في تحسين تجربة المستخدمين عن طريق تقديم المحتوى بسرعة وأمان.
أمثلة على الـ CDNs:
- الـ Cloudflare: وهي واحدة من أشهر الـ CDNs اللي بتقدم خدمات تسريع وتحسين أداء المواقع والتطبيقات.
- الـ Amazon CloudFront: ودي خدمة CDN مقدمة من Amazon Web Services (AWS).
في الختام
الأنظمة اللي بتركز على عمليات القراءة الكثيفة محتاجة تخطيط كويس جدًا علشان تقدر تشتغل بكفاءة. وبالتأكيد فيه استراتيجيات تانية كمان زي الـ Data Denormalization والـ Materialized Views وغيرهم ما اتكلمناش عنهم فلو حابين اننا نتكلم عنهم ممكن نتكلم عنهم برضو في ورقة تانية.
والاستراتيجيات دي ممكن يكون ليها تأثير كبير على تحسين الأداء وبرضو كل استراتيجية من دول ليها مميزات وتحديات، والمهم هو إننا نختار الأنسب لنظامنا والبيانات اللي بنتعامل معاها.