لمحة جافاوية خاصة 3: نقطة انتباه في برمجة الويب

السلام عليكم

كيف حالكم يا شباب
اليوم كنت على موعد مع الصرصور الحزين
ماذا لم تسمعوا عنه؟
غريب أمركم يا شباب
الصرصور الحزين من الشخصيات اللامعة في الفن
multitalent أو متعدد المواهب ( بلغة الشوارع 🙂 )
بأمانة كان لقائي معه من محاسن الصدف
وغنا لي رائعته الحزينة (دعوة للتعايش)
التي يقول في مطلعها
أنا كنت يوم صرصور جميل
كان لي إخوان وأصحاب كثير
لكن صحيت في يوم حزين
لقيت نفس صرصور وحيد
بآسي في الدنيا دب
لوحدي عايش وكأني مش عايش
ليه تقتل الصراصير يا إنسان يا قوي
خلينا عايشين مع بعض وحابين بعض
إلى نهاية القصيدة المشهورة
طبعاً كانت أمسية جميلة جداً
طااااااااااخ
(كف عن الاستظراف)
احم احم أنتا تأمر يا أخ عبده
اليوم سنتكلم عن برمجة الويب
أعرف أن البعض استنتج هذا بسبب كون اللمحة خاصة
لكن هناك البعض الآخر لم يتذكر هذا الموضوع
وأنا أحس بهذه العينة من الناس لأني أحدهم
على كل لندخل في لب الموضوع
عندما يعمل المبرمج في حقل برمجة الويب
ويستلم أول موقع يأخذ وقته في البرمجة
فإنه يحاول أن يعمل بجد واجتهاد لكي يظهر الموقع في أجمل حلة
بالطبع عند تجريبه للموقع فإنه يعمل بشكل فعال دون أي مشاكل تذكر
جميل جداً
ما رأيكم لو قمنا بتجربة الموقع في مجتمع ما يتجاوز عدد أشخاصه 10000؟
النتيجة أكيدة سيطرد المبرمج من الشركة التي يعمل فيها
(ما عدا لو كان هو نفسه صاحب الشركة على كل النتيجة لن تختلف
كثيراً لأنه سيغلق الشركة بعد أن يقتنع أنه حمار وكان يجب عليه
الاستثمار في أشياء مفيدة مثل الطعام والشراب 🙂 )
ما الذي حصل في رأيكم؟ وما سبب هذه المشاكل؟
البعض يتعامل مع برمجة الويب كما يتعامل مع البرامج ذات الخيط الواحد
ولا يأخذ في الاعتبار كون الحزمة Servlet التي يقوم عليها معظم برمجة الويب متعددة الخيوط
صحيح أن التعامل مع الحاويات الموجودة في Servlet آمن تماماً لكن الشيفرة الخاصة بك غير آمنة
هناك ثلاث أنواع من الحاويات في الحزمة Servlet ألا وهي
1- الحاوية على مستوى الموقع ككل ServletContext
2- الحاوية على مستوى جلسة العمل HTTPSession
3- الحاوية على مستوى الطلب الواحد HTTPServletRequest
الخادم Server يقوم بتوكيل كل طلب request إلى خيط من الخيوط المعدة للطلبات
لذا لا مشكلة في الحاوية رقم 3 لأنها لا يشترك فيها أكثر من خيط في نفس الوقت
المشكلة في الحاويتين 2 و 1

لنأخذ مثال بسيط
شركة للبيع على الإنترنت تريد موقعاً يحتوي على قائمة من البضائع
وتريد في الموقع نظام حاوية shopping cart
لنقل أنها تريد نوعين من الحاويات
1- الحاوية الأولى للشخص الواحد
2- الحاوية الثانية يتشارك فيها مجموعة أشخاص
(لنقل أن مجموعة من الشركاء يريدون أن يقوم الجميع بالموافقة على شراء الشيء ليتم شراؤه)
تأتي أنت تقوم بوضع الحاويات في ServletContext
عند بداية تشغيل الموقع لتوفر الوقت في البرنامج الخاص بك
لنفرض أن الحاوية أ يشترك فيها عمر وعصام
قام عمر بتسجيل الدخول ووضع بعض البضاعة في الحاوية
ثم أتى عصام وسجل دخوله في أثناء تواجد عمر
أراد أن يضيف مجموعة أخرى من البضائع
أنت طبعاً لا تعرف أن عصام حالياً يعدل على الحاوية فتأتي وتضيف لعمر في نفس الحاوية
لاحظ ما الذي قمت به
عصام يضيف على الحاوية وعمر يضيف على الحاوية
طبعاً أنت تستخدم ArrayList في الحاوية
مبروك فقد حصلت على أول مشكلة عمر أو عصام أضاف أشياء لم تظهر له
طبعاً سينبته أحدهم إلى الموضوع وتضيع أنت في الزحام

طيب لنفرض أنك تخزن مع كل شيء يضاف إلى الحاوية اسم الشخص الذي أضافه
لنفرض أنك تخزن الاسم بداية ثم تخزن رقم الصنف الذي يريد الشخص شراؤه
خذ عندك السناريو التالي
عمر أضاف شيئاً إلى الحاوية وفي نفس الوقت أضاف عصام
عند وصول البيانات إلى الموقع تم التخزين بالطريقة التالية
خزن اسم عمر
ثم جاء اسم عصام فخزن فوق اسم عمر
الآن دور البضاعة خزن رقم الصنف الذي وضعه عصام أولاً
ثم خزن رقم الصنف الذي وضعه عمر فوقه
مبروك هذه ثاني مشكلة بيانات غير صحيحة أضيفت
وسيأتيك عصام يسب ويلعن ويتهم الشركة بأنكم مجرد سارقون لا أكثر ولا أقل
وفي النهاية ستطرد من الشركة

لنأخذها قاعدة من الآن وصاعداً
لا تأخذ موضوع آمان الخيوط ببساطة لأنه يسبب الكثير من الكوارث
كوارث من الحجم الثقيل التي قد تؤدي إلى فصلك 🙁

تحياتي

المراجع:
1- مقالة على موقع IBM بعنوان Are all stateful Web applications broken?

Tags: , , , , , , , , , , ,

One Response to “لمحة جافاوية خاصة 3: نقطة انتباه في برمجة الويب”

  1. […] Pool 8- لمحة جافاوية 56: كرر لكل عنصر في ضوء تعدد الخيوط 9- لمحة جافاوية خاصة 3: نقطة انتباه في برمجة الويب 10- لمحة جافاوية 59: استخدم المؤقت 11- لمحة جافاوية 60: […]

Leave a Reply