كان ديجكسترا يلمح لقصة صندوق بندورا في الميثولوجيا الاغريقية حيث اعطوها الالهة كل شيء تحتاجه بالإضافة إلى هدية وهي صندوق "باندورا هدية بالاغريقية - من هنا اتت الكلمة". المهم ابلغوها ان لا تفتحه لكن الفضول او اللقافة جعلتها تفتحه واخرجت الشر للدنيا. لنعود للموضوع الرئيسي.
لو كان هناك حدث ما شاغلك في مكان بعيد و تحتاج انك تعرف عن مستجداته فأمامك طرق: مثلاً انك تتصل بشخص و تفتح مع اتصال مباشر طويل ليخبرك عن المستجدات ( مثل لما تتابع اخبار التلفزيون ) او انك تتصل به كل 5 دقايق و تسأله هل من جديد؟! او طريقة اخرى انك تخبره ان يتصل هو بك عندما يستجد شي.
الطريقة الأخيرة هي طريقة الInterrupts. او المقاطعات .. كأنك تقوله اتصل بي وقاطعني اول ما يكون هناك مستجد لأن لدي اشياء اخرى مهمة لأقوم بها. هذه الطريقة هي الأقل تكلفة بالنسبة لك.
اختراع الInterrupt في الخمسينيات مهد لظهور انظمة التشغيل في الستينيات لانه كان من الصعب ان تبني برنامج يراقب المدخلات وفي نفس الوقت ينتبه لادخالات المستخدم حتى ان الMultitasking لم يأتي الا في اخر الستينيات. اما الMulti-threading ففي التسعينيات و الMulti-processing في الالفينات.
لنعود لمثال التلفزيون. لاحظ ان قناة التلفزيون لا تعرف ماذا يهمك و تنشر publish اخبار عن events لكل من اختار أن يشترك بها Subscribe و لو بالمشاهده. لكن تبقى هناك مشكلة وهي انه مسؤوليتك ان تنتبه لما يهمك اثناء سرد الاخبار. اي تقوم بنفسك بعمل Filtering لما تشاهد او تسمع.
كثير من الانظمة تحتاج لأن تعرف عن احداث في انظمة اخرى. لكن من الصعب ان تستمع لكل الأحداث و تفلترها بنفسك. فبدلاً من ذلك من الأفضل أن تخبر النظام الآخر بما تحتاجه و هو من يقوم هو بالفلترة. مثل ان تخبر شخصاً يعرف مايهمك بأن يتصل بك callback عند كل حدث event.
اذا هو ليس شأن البرامج ولا يؤثر على ادائها و ايضاً لأنه الصعب ان تقوم بعملية مراقبة دائماً من خلال while(true) فهذا يستهلك مواردك و لو خصصت شخصاً اخر بهذا الشيء كـ Thread مثلا. فالحلول على مستوى البرنامج هناك Design pattern هو الObserver ( المراقب ) ليخلصك من الWhile(true).
لكن على مستوى الArchitecture هناك الSub/Pub و هو مشتق من الObserver و هو اساس الEvent Driven Architecture. هناك انظمة كثيرة متخصصة توفره مثل Kafka و RabbitMQ و غيرها. و حتى Redis و بعض قواعد البيانات.
ايضاً يمكنك بناءه ايضاً بنفسك ببرتوكولات الشبكة سواء كان TCP او UDP. الثاني اسرع لانه لايحتاج لانشاء اتصال لكن الأضمن استخدام TCP عبر الWebSocket مثلا او باستخدام مكتبات مثل SignalR في دوت نت او غيرها للغات الاخرى. هذا على مستوى الApplication.
على مستوى قواعد البيانات فأغلبها توفره مثل Service Broker في SQL Server او Advanced Queuing في Oracle. في PostgreSQL من خلال LISTEN/NOTIFY و في MySQL ممكن من خلال اضافات مثل Q4M.
- انتهى.
- انتهى.
جاري تحميل الاقتراحات...