التويتر من الداخل وسيئة الروبي
في مقابلة مع مطور من مطوري التويتر Alex Payne (حالياً هو مدير فريق تطوير API في تويتر وهي العمود الفقري وتشكل نسبة العظمى من تطوير التويتر وهي أيضاً سبب انتشار التويتر) أجاب عن عدة أسئلة ولكن مايهمني منها هي الأسئلة المتعلقة ببنية التويتر البرمجية وتناول أيضاً أكبر سيئة للروبي وبالتأكيد الروبي أون ريلز لأنها مبنية على الروبي. إذاً السيئة موجودة في الريلز الذي بني عليه التويتر.
كنت أعرف أن الريلز فيها هذه المشكلة وعندما قرأت هذه المقابلة تأكدت من المعلومة وحصلت على معلومات غيرها عن سيئات الريلز، طبعاً أنا لست ضد الريلز وبرمجت بها لفترة (قبل الكيك) وأعجبت بها لكن الحذر واجب، وعند ظهور الكيك انصب اهتمامي عليه خاصة وأن بنيته وميزاته تشبه الريلز كثيراً.
ملخص المقابلة وبتصرف:
عندما بدأت بتطوير الويب، بدأت التطوير بالـ PHP كحال كل مبرمج وصنعت بعض السكربتات مع صديقي بالروبي وعند ظهور الريلز سررت جداً بوجود أداة مكتوبة بالروبي لتطوير الويب.
طورت العديد من مواقع المنظمات الغير ربحية ومواقع الحملات الانتخابية وعندما بدأ التويتر بالظهور في 2006 طلبوا مطورين للعمل فتقدمت إليهم وعملت في البداية كمتعاقد (ليس موظفاً أي العمل على مهمات تشبه المبرمج الحر قليلاً)، ثم تم قبولي كموظف دائم في فريق التويتر.
من المعروف الآن أن التويتر هو أكبر موقع بالعالم مكتوب بالريلز وهذا ما أجبرنا على العمل في مشاكل الثباتية (scaling)، وكان الحل الوحيد لزيادة الطلبات على التويتر وبالتالي زيادة مشاكل الثباتية هي بإضافة المزيد من المخدمات وبالطبع العديد من المخدمات تعني العديد من الطلبات على قاعدة البيانات الوحيدة لأن الريلز لاتدعم تعددية قواعد البيانات وكان الحل لهذا بالتخزين المؤقت (caching) لكل شيء يطلب من قاعدة البيانات ووضع هذه الكاش في مخدمات قراءة فقط (read-only).
كل هذا فرض علينا المزيد من الكلفة والوقت الضائع لجلب الطلبات، وهذا العقاب هو مصير كل مطور بالريلز وعندما تصل لهذه المرحلة من كثرة الطلبات عليك بأحد الحلين أو كلاهما: استعمال كل الأدوات الممكنة لتحسين الريلز (RJS, ActiveRecord, ActiveSupport) والحل الآخر هو بنقل الأجزاء التي يحدث فيها بطىء (أي الأكثر تلقياً للطلبات) إلى لغة آخرى سريعة (C, PHP, Python).
ويجب أن لايغيب عن بال أي مطور بأن الروبي بطيئة. العديد من المبرمجين يعملون الآن على تحسين سرعتها ولكنها في الوقت الحالي بطيئة، فعندما تطور تطبيق كبير ستلاحظ بأن سرعته بالبايثون مثلاً أسرع من الروبي.
كل المطورين في التويتر هم من عشاق الروبي ولكن نقولها وبصراحة بأن الروبي بطيئة.
ثم تكلم أليكس عن الميزات القادمة في تويتر ومنها “المجموعات” التي تطلب بشكل كبير من قبل مستخدمي تويتر.
أهداف هذه التدوينة:
- استغلال الفرصة، الخبرة (أهم شيء وإلا صرف من التعاقد ولم يوظف) والحظ في تقدمه للعمل مع تويتر
- نظرة على التويتر من الداخل وبنيته
- سيئة الروبي والريلز وهي البطىء خصوصاً في التطبيقات الكبيرة
- التعرف على بعض الطرق لتحسين سرعة وأداء الريلز
















التويتر كان سبب من اسباب توجيه الانتقادات للريلز نظرا لانه يعتبر من اكثر المواقع الكبيرة اعطالاً و قيل ان السبب في ذلك هو الريلز علي اي حال اعتقد انه حين بُرمج التوتير لم يكون في حسبان المطورين انه سيكون بهذه الشهرة و لكن لكل تقنية و لها اوجه قصورها و بالفعل الروبي اتخذت عدة خطوات للامام لتحسين سرعتها و الامر كله مسألة وقت و اعتقد ان في الاصدار الثاني من الروبي Ruby 2.0 ستكون الروبي اكثر من رائعة و الريلز مبنية علي الاصدار 1.8.6 من الروبي ايضا في اعتقادي الشخصي ان سبب اعطال او بطء التويتر يرجع للريلز بل الي خوادمهم في المقام الاول و مبرمجيهم في المقام الثاني ثم الروبي في اخر الامر و تخميني هذا نظراُ لانه معروف ان اصحاب التويتر هم عالم “غلابة”

اللهم لا تجعلنا من اصحاب التويتر
تعليقك يدل على فهمك العميق للروبي، وأنا انتظر بشوق النسخة الثانية منها.
يعني العتب بالمقام الأول على الروبي ومن ثم على التجهيزات.
بالنسبة لرأيك بالمطورين فلا أعتقد أنهم غلابة (مابعرف من وين جبت هالمعلومة!) وثانياً أكيد خوادمهم ليست استضافة مشتركة
هههههههههههههه مش لدرجة استضافة مشتركة و لكن الامر و ما فية لو انك تتابع اخبار التويتر ستجدهم قد قاموا بالغاء خدمات الرسائل القصيرة لكل الدول ما عدا امريكا و كندا و عللوا ذلك بان لا يوجد “مصاري” لتغطية التكاليف و انهم عالم “غلابة” و انا كنت اقصد انهم غلابة من الناحية المادية
و ان كنت اري انه لا يصح ان نلقي باللوم علي الاداة المستخدمة في البرمجة لان هذا يعد قصورا فينا ايضا
ثانيا لو تري جداول Downtime للمواقع الكبيرة و عدد الساعات التي تكون فيها المواقع Offline ستذهل بنتائج التوتير فلو قارنت موقعي الذي يستخدم “استضافة مشتركة” بالتوتير ستجده افضل منه
اعتقد ان التويتر يحتاج لان يباع لشركة كبيرة كجوجل مثلا و ستكون اضافة رائعة لخدمات جوجل.
و صدقني لست ضليع بالروبي كما تظن و لكني احاول ان اكون
من الناحية المادية فمعك حق وقد ذكرت ذلك بتدوينة سابقة بأن هذه من سيئات التويتر، ولكن ليس لدرجة أن يضحوا بالأداء في مقابل المادة. أي بالتأكيد لديهم فريق من أفضل المبرمجين وهذا ماتلاحظه في الموقع الخاص بالتطوير بهم.
وبالفعل أكثر من مرة شاهدت توقف الموقع، والسبب الأول هو الروبي، وأيضاً مستغرب لحد الآن لماذا لم تشتريه الشركات الكبيرة. غالباً عرض عليهم هذا ولكنهم ربما ينتظروا أن تزداد قيمته السوقية بطرح أسهم الشركة للبيع ربما!
عادي، لكل لغة برمجية سلبيات كما لها إجابياتها الخاصة. طريقة البرمجة والتنفيذ هي ما تحدد ثبات وقابلية التوسع لكل برنامج. ولا تنسوا هنا أن كل خدمات 37signals مبرمجة بالريلز، وهي خدمات تجارية يتجاوز مستخدموها المئات من الآلاف.
مشكلة تويتر كما إعترف أحد مبرمجيها ذات وقت هو البنية الداخلية للتويتر. فهم لم يتوقعوا النجاح الذي سيصلون إليه ولم يكن هناك تخطيط مناسب لطريقة التنفيذ الأفضل. صحيح أن الريلز بطيئة لكن هناك الكثير من الحلول التي تسرع برمجيات الريلز. وتويتر نفسه يمكنه أن يصبح أسرع وأقل تكلفة لو أعيد برمجته من الصفر. لكن هذا قد يكون مستحيلا إذا لم يكن تصميم قاعدة البيانات يسمح بذلك.
تماما أخي سعيد ولكن تبقى بطيئة وأبطىء من اللغات الحالية بكثير. هذا الكلام لم أخذه من التويتر فقط ولكن أيضاً من صديق لي (مطور) يستخدم الريلز في موقع مشهور ويأتيه أكثر من 100 ألف زيارة شهرياً. قال لي بأن مشكلتهم الكبرى هي الثباتية وسببها البطىء لديهم حالياً 4 مخدمات ومع ذلك يواجهون مشاكل في انقطاع الموقع عن العمل دائماً وهذا لايحدث إذا استخدمت PHP أو Python.
ولانعرف جماعة 37 سيغنالز كم مخدم لديهم بالخدمة! ممكن عندهم عدد كبير حتى يخدموا مستخدميهم ولكن بالتأكيد عدد المخدمات سيخف بلغة غيرها.
موقع آخر مشهور أزوره باستمرار ومبرمج بالريلز وغالباً أجده خارج الخدمة (out of service)!! هذا الشيء لايحدث مع المواقع المطورة بال PHP أو ASP حتى.
الشيء الأهم لبطىء الروبي هو أنها تستخدم معالجة وحيدة (Single Process)، فعلى الرغم من وجود multi-threading فيها ولكن هذه multi-threading عبارة عن وهم لا أكثر!
راجعوا هذا الموضوع بتمعن:
http://rubylearning.com/satishtalim/ruby_threads.html
ولاحظوا جملة:
Finally, if your machine has more than one processor, Ruby threads won’t take advantage of that fact – because they run in one process, and in a single native thread, they are constrained to run on one processor at a time.
يعني تعددية المهام مجرد وهم وبالحقيقة إذا كان لديك أكثر من معالج فلن تستفيد منهم! فتعددية المهام في الروبي هي مجرد تشغيل للمهام بنفس الوقت ولكن كل مهمة عليها أن تنتظر المهمات التي قبلها ولاتستفيد من وجود عدة معالجات أو معالجات ثنائية أو رباعية النواة!
الخبر المفرح هو دعم الروبي 1.9 لتعددية المهام فعلياً، ففي مقابلة مع مؤسس الروبي ومؤسس YARV (اليارف عبارة عن VM للروبي) تحدثوا عن هذا (لم أجرب الروبي 1.9):
http://www.infoq.com/news/2007/05/ruby-threading-futures
كلمة أخيرة، المعالجة الوحيدة عيب كبير باللغة وبالتأكيد لم يكن ببال مبتكر الروبي أن تنتشر هذا الانتشار الكبير ولم يكن بباله أن تتطور المعالجات لهذه الدرجة يصبح هناك المعالجات ثنائية النواة ورباعية النواة، ولكن الآن تتخذ خطوات جدية لسد هذا العيب ومنها YARV.
لم أخض كثيراً في الروبي وتعددية المهام فيها لذا أرجو من المختصين بهذا أن يشاركونا رأيهم.
فعلا، تعددية المهمام هي أبرز نقطة ضعف في الروبي (والريلز بالتبعية). الإصدار 1.9 من روبي يقدم الحل. والريلز كذلك ستقدم الحل في الإصدار القادم 2.2 أو الذي بعده. لكم كما قلت، هناك الكثير من الحلول، وكل يوم تقريبا يظهر جديد، لدعم تعدد المهام في الريلز. لكنها حلول تجعل من عملية إستضافة الريلز كابوسا حقيقيا للمطورين. أحدث هذه الحلول هو Passenger أو كما يعرف بـ mod_rails. يعتبر حلا واعدا وسيهل كثيرا من عملية الإستضافة والتقليل من إستنزاف الموارد.
بالنسبة لـ 37signals كان لديهم 30 سيرفرا مع نهاية 2007. ونظرا لظهور حلول أفضل لإستضافة الريلز فقد كانوا يخططون لخفظ عدد السيرفرات إلى 16 فقط. لا أدري إن كانوا قد نجحوا.
جيمس ادوراد في رده علي سؤال
Keith Brady, Australia>> What are the pros and cons of Ruby that are being discussed in the development community and what is your opinion on that?
James>> You’ll hear a lot of people say, “Ruby is slow.”
That can be true, but it doesn’t have to be. I just gave a presentation at the LSRC that showed multiple ways to get Ruby to do work in fractions of a second.
My opinion on the speed rumors is that you shouldn’t believe everything you hear. I’m sure there are tasks Ruby is too slow for, but there are also a surprising number of tasks where you can make it go fast enough.
و هذا ما يمثل وجهه النظر السائدة … نعم الروبي بطيئة في بعض الاشياء و لكن من الممكن جعلها اسرع لو كان المبرمج متمرسا
و لو زرت صفحة الروبي في الويكبيديا ستجد ما المشكلات الحالية في الروبي و المتوقع حلها قريبا.
@محمد: يمكن عندهم 37 سيرفر بما أن اسمهم 37 سيغنالز
@أحمد: شكراً لك … إضافة جميلة
شو هو التويتر
بالنسبة لتعددية المهام في الروبي
هل يوجد تعددية مهام في ال php
هذه تدوينة سابقة عن التويتر:
http://dev.holooli.com/2008/09/20/%d8%aa%d9%88%d9%8a%d8%aa%d8%b1-%d9%88%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-%d8%a7%d9%84%d8%a7%d8%ac%d8%aa%d9%85%d8%a7%d8%b9%d9%8a%d8%a9/
تعددية المهام في PHP تأتي من Apache حيث ينفذ العديد من المهام بنفس الوقت ولوحده أي لاحاجة لأن تكتب تطبيق متعدد المهام فهو بطبيعته سيكون كذلك
خالد عن عم اسمع كتير عن لغة الروبي
و حابب اتعلمها
ممكن تعطينا شرح عنها و بعض المصادر
إن شاء الله فقط انتظر كم يوم