ال CAP Theorem هي واحدة من اشهر النظريات اللي الناس بتحب تتكلم عنها في الانترفيوهات خاصة بتاعة السيستم ديزاين. لكن هي مش بس حاجة نظرية لانترفيو او امتحان، هي حاجة بنتعامل مع تأثيرها كل يوم كمستخدمين، وبنحتاج ناخد قرار على اساسها كمبرمجين.
التعريفات هي كالتالي
- Consistency: كل عملية قراءة، بتمثل احدث معلومة في قاعدة البيانات
- Availability: كل طلب لقاعدة البيانات بيكون طلب ناجح
- Partition : وهي ان النظام يقدر يكمل شغله عادي ويستقبل الطلبات وينفذها، لو لاي سبب حصلت مشكلة في الاتصال بين مكونات النظام
- Consistency: كل عملية قراءة، بتمثل احدث معلومة في قاعدة البيانات
- Availability: كل طلب لقاعدة البيانات بيكون طلب ناجح
- Partition : وهي ان النظام يقدر يكمل شغله عادي ويستقبل الطلبات وينفذها، لو لاي سبب حصلت مشكلة في الاتصال بين مكونات النظام
النظرية دي بتقول انك في اي distributed system تقدر انك تحقق اتنين من التلاتة دول فقط في نفس الوقت. لو الكلام ناشف ورخم ده منطقي، هو فعلا ناشف ورخم.
en.wikipedia.org
en.wikipedia.org
فتعالى نتكلم بمثال، خلينا فاكرين نفس التنويه بتاع المرة اللي فاتت، الموضوع قديم وانا مجبتش اي جديد، باشرحه باسلوبي واسلوبي ده مزيج من حاجات قريتها زمان، فاي تشابه بينه وبين مواقع او كتب، تعرف انهم اصحاب الفكرة مش انا.
في يوم من الايام جتلك فكرة انك تعمل خدمة مفكرة مناسبات للناس، ببساطة ناس هتكلمك تقولك عاوز تسجلي التاريخ ده بالاسم والمناسبة. ولما يكلموك تاني يسألوك عن تاريخ المناسبة، تبص في المفكرة بتاعتك وتقولهم التاريخ.
المهم بتقرر تنفذ مشروعك وتنزل اعلان، وبيجيلك اول عميل. بيطلب منك انك تسجل تاريخ ٢ يوليو باعتباره عيد ميلاد مراته، بتعمل كده وبعدها بتكلمك عميلة تانية تقولك انها عاوزة تسجل تاريخ ١مارس على انه معاد طيارتها لهولندا، بالفعل بتسجل المعلومات في المفكرة عندك وبتشكرها وبتقفلوا.
المهم، الناس بتسمع عن فكرتك وبتعجبهم وبيبتدوا يستخدموها، ويتكلموا مع بعض عنها. بيبتدي يجيلك ناس كتير، والعدد بيزيد عليك مش بس كده، ده انت لما تعبت ومعرفتش تشتغل، ضاع عليك كل العملاء بتوع اليوم ده.
فبتبتدي تدور على حد يساعدك وبتوصل لبنت، هتوافق انها تساعدك مقابل انها تكون شريكة في الشركة. بتعمل اكستنشن لخط التليفون، اللي بيخليكم تقدروا تردوا على اتنين عملاء في نفس الوقت على نفس الرقم.
المهم شريكتك بتبتدي شغل، والدنيا ماشية كويسة، الناس بتكلمكم وبتتطلب انك تسجلوا تواريخ وبتعملوا ده بكل نجاح والدنيا ماشية حلو جدا، لحد ما يجيلك تليفون من عميل بيسأل عن معاد رحلته للهند، بتقوله ينتظر ع الهولد لحد ما تدور على المعاد.
بعد تدوير بترجع تعتذرله تقوله ان مفيش معاد للرحلة متسجل عندك، العميل بيتعصب جدا وبيقولك انه اتصل سجله امبارح.
بتقعد تفكر ايه السبب لحد ما توصل لان العميل ممكن يكون كلم شريكتك.
بتروحلها بتبص على المفكرة بتاعتها وبالفعل بتلاقي المعاد، واول ما بتحكيلها هي كمان على طول بتدرك المشكلة.
بتقعد تفكر ايه السبب لحد ما توصل لان العميل ممكن يكون كلم شريكتك.
بتروحلها بتبص على المفكرة بتاعتها وبالفعل بتلاقي المعاد، واول ما بتحكيلها هي كمان على طول بتدرك المشكلة.
الموقف اللي حصل ده هو فشل ال consistency وهي بتحصل لما تضطر انك تكتر عدد السيرفرات عشان تعرف تستقبل وتشتغل على طلبات اكتر، بس في نفس الوقت السيرفرات دي مش بس بتعمل عمليات قراءة، دي كمان بتعمل عمليات كتابة، وبالتالي هيبقوا بيكتبوا حاجات مختلفة.
بتقعد تفكر في حل المشكلة، وبتوصل لفكرة بسيطة وبتروح لشريكتك تقولها الاتي:
اي حد فينا هيجيله مكالمة من عميل عشان يسجل تاريخ، قبل ما يقفل المكالمة هيروح يكلم الشخص التاني عشان يسجل المعاد عنده في المفكرة وبكدة بقت المفكرتين فيها نفس المعلومات والعملا يقدروا ياخدوا مواعيدهم من اي حد
اي حد فينا هيجيله مكالمة من عميل عشان يسجل تاريخ، قبل ما يقفل المكالمة هيروح يكلم الشخص التاني عشان يسجل المعاد عنده في المفكرة وبكدة بقت المفكرتين فيها نفس المعلومات والعملا يقدروا ياخدوا مواعيدهم من اي حد
شريكتك بتقولك انها فكرة حلوة جدا، بس بتقولك هنعمل ايه لما حد فينا يكون تعبان وميقدرش ييجي الشغل، كده مفيش ولا مكالمة تسجيل معاد هتنجح، لان مش عارفين نكتب المعلومة في المفكرة التانية. بتوافقها وبتروح تفكر في حل جديد.
الموقف ده بقى هو مشكلة ال Availability، بيحصل لما يكون عندك اتنين سيرفرات يتعاملوا مع الطلبات اللي بتيجي بس واحد منهم بيكون واقع او فيه مشكلة تمنع الكلاينت بتاعه انه يوصل ليه لاي سبب.
المهم انك بعد ما بتدرك المشكلة التانية، بتبتدي تدور على حل جديد ينفع يخرجك من المشكلتين، المهم بعد ما بتسهر طول الليل بلا جدوى، بتروح الشغل تلاقي شريكتك بتقترح عليك حل لتخطي المشكلة دي. الخطة كالتالي:
١. اي حد بيجيله مكالمة لتسجيل معاد، قبل ما يقفل المكالمة بيحاول يوصل لشريكه عشان يسجل التاريخ الجديد
٢. لو لقى شريكه مش متاح يبعت ايميل فيه المعلومة اللي عاوز يسجلها
٣. تاني يوم الصبح، الشخص اللي كان غايب، يراجع كل الايميلات ويسجل المعلومات عنده قبل ما يبتدي يستقبل اي طلبات جديدة
٢. لو لقى شريكه مش متاح يبعت ايميل فيه المعلومة اللي عاوز يسجلها
٣. تاني يوم الصبح، الشخص اللي كان غايب، يراجع كل الايميلات ويسجل المعلومات عنده قبل ما يبتدي يستقبل اي طلبات جديدة
الفكرة بتعجبك وبتتحمسها لها وبتقرروا انكم تنفذوها، وبكده بتشوفوا انكم بقيتوا Consistent and Available
بيفوت كام يوم والخطة بتاعتكم ناجحة والدنيا ماشية حلوة وبالفعل لما حد فيكم ما بيجي، زميله بيبعت ايميلات بالمعلومات الجديدة عشان يدونها وتاني يوم بيروح يضيفها عنده وهكذا. لحد ما في يوم شريكتك كانت غايبة فيه، عملت الاتفاق بتاعكم وابتديت تبعت ايميل مع كل تحديث بييجي.
جه تاني يوم وشريكتك ابتدت شغل، فتحت الايميل وابتدت تسجل المواعيد في مفكرتها وابتدت تستقبل مكالمات. لحد ما جالها مكالمة من عميل بيسأل عن معاد عيد ميلاد مديره. فضلت تدور وملقتش المعاد، الموقف ده حصل قبل كده لما كنتوا بتواجهوا مشكلة ال Consistency، بس انتوا حلتوها ايه اللي هيكررها!
المهم شريكتك اعتذرت للعميل ووعدته انها هتحقق في المشكلة دي وترجع تكلمه.
بتجيلك على مكتبك وتحكيلك اللي حصل، وبتشوفوا المفكرة بتاعتك، وبالفعل بتلاقوا المعاد، بتقعدوا تفكروا ايه اللي حصل، بتبتدي هي تراجع الايميلات عندها وتشوف لو كانت مثلا فوتت ايميل او حاجة، مبتلاقيش اي أثر!
بتجيلك على مكتبك وتحكيلك اللي حصل، وبتشوفوا المفكرة بتاعتك، وبالفعل بتلاقوا المعاد، بتقعدوا تفكروا ايه اللي حصل، بتبتدي هي تراجع الايميلات عندها وتشوف لو كانت مثلا فوتت ايميل او حاجة، مبتلاقيش اي أثر!
بترجع لمكتبك وبتقولك ان هي مجالها ايميل، انت بتقولها ازاي ده حصل، انا فاكر العميل ده كويس وبعتلك الايميل امبارح، بتروح تبص على "صندوق الصادرات" بتاعك بتلاقي انك كتبت ايميل فعلا، بس السيرفر كان واقع والايميل ده تحديدا ماتبعتش.
بتشوفوا انكم قدام حلين:
١. انكم متحلوش المشكلة اصلا لصالح انكم تحافظوا على حلكم للمشكلتين الاولانيين
٢. ان شريكتك متستقبلش اي مكالمات لحد ما تضمن ان كل الرسايل وصلت وتتأكد ان مفيش عند الشخص التاني اي حاجة متبعتتش قبل ما تبتدي المكالمة، وده معناه التضحية بال Availability
١. انكم متحلوش المشكلة اصلا لصالح انكم تحافظوا على حلكم للمشكلتين الاولانيين
٢. ان شريكتك متستقبلش اي مكالمات لحد ما تضمن ان كل الرسايل وصلت وتتأكد ان مفيش عند الشخص التاني اي حاجة متبعتتش قبل ما تبتدي المكالمة، وده معناه التضحية بال Availability
اللي حصل ده هي اخر مشكلة بتطرحها النظرية، ال Partition Tolerance، لو الاتصال اللي بين سيرفرين اتقطع لاي سبب، هل النظام بتاعك هيعرف يتعامل مع المشكلة دي ولا لا.
Bonus: Eventual Consistency
وهي انكم تعينوا حد شغلته بس انه كل شوية ياخد من المعلومات من الاول ويروح يكتبها عند التاني، طبعا ده معناه اننا ضحينا بال consistency اللحظية لصالح ان الاتنين يقدروا ياخدوا مكالمات في اي وقت وان لو خط التواصل ما بين الاتنين وقع لسه قادرين يكملوا شغل.
وهي انكم تعينوا حد شغلته بس انه كل شوية ياخد من المعلومات من الاول ويروح يكتبها عند التاني، طبعا ده معناه اننا ضحينا بال consistency اللحظية لصالح ان الاتنين يقدروا ياخدوا مكالمات في اي وقت وان لو خط التواصل ما بين الاتنين وقع لسه قادرين يكملوا شغل.
بنسمي الشخص اللي هيعمل الشغلانة دي: Replicator وطبعا زي ما انت شايف التضحية اللي احنا قدمناها في ان المعلومات مش هتكون جاهزة في لحظتها، فيه وقت اللي الشخص ده بيقوم كل شوية يبص على المعلومات اللي عندك ويروح يكتب عند شريكتك، لو افترضنا ان الوقت ده ١٠ دقايق
ده معناه ان لو فيه عميل سجل معلومة عندك واتصل في خلال ٩ دقايق وشريكتك ردت عليه، المعلومات هتكون لسه مش عندها. الوقت ده بنسميه Replication Delay ومصلحتنا انه يكون اقل شئ ممكن.
المثال اللي انا استخدمته فوق ده انا جايبه بتصرف وترجمه من المقال ده: ksat.me واللي هو اكيد احسن من اللي انا كاتبه، فلو عندك وقت اقراه :)
تم!
تم!
جاري تحميل الاقتراحات...