الكود يعمل لكن هنالك كود أكثر جودة منه
بسم الله الرحمن الرحيم
أود أن أذكر لكم قصة في تعاملي مع mongoDB -قاعدة بيانات NOSQL- القصة باختصار كان مشروعي يستغرق حتى ينجز مهمته المجدولة 3 ساعات والمهمة المجدولة هي كل 6 ساعات
وعندما يريد تنفيذ المهمة كان يأخذ CPU كلها والشركة ترسل لي رسالة أن ال CPU لديك 100% منذ ساعتين.
بحثت بالسبب لم أجد شيء مريب، قلت ربما لضخامة العمل الذي يقومه، وكنت أود أن أرفع مواصفات السيرفر، ولكن في نفس الوقت كنت أود نقل إدارة المشروع من منصة بوت تلغرام إلى بوت slack
وفي خضم النقل وتفاصيله، قلت لما لا أعيد صياغة الكلاسات والمشروع بشكل كامل فالمشروع قديم وتعلمت أشياء جديدة لابد من تطبيقها.
بالفعل أعدت النظر بالمشروع عدلت بعض الامور وكل شيء على ما يرام وذهبت إلى الجزء الخاص بالكود للتعامل مع داتا بيز وإذا هنا الكارثة.
مشروعي هو ارشفة بعض حسابات تويتر، وحتى لا يجلب كل تغريدات يأتي بأخر 10 تغريدات مخزنة في قاعدة البيانات لهذا الحساب وعند جلبي للتغريدات من التويتر اقارن كل تغريدة أجلبها هل هي موجودة ضمن ال 10 تغريدات إذا موجودة اتوقف لان كل تغريدات عندي وإن لم تكن موجودة فأجلب التغريددات حتى أصل لما هو عندي.
طريقة مستخدمة لجلب اخر تغريدات لحساب معين هي:
count_tweets_user = db.getCollection('statuses').find({'user.id_str': 'XXXXXXXX'}).count()
last_10_tweets_user = db.getCollection('statuses').find({'user.id_str': 'XXXXXXXX'}).skip(count_tweets_user - 10)
كما تلاحظون يقوم لكل حساب بعمليتين على قاعدة البيانات يجلب عدد تغريدات الرجل المخزنة ثم يعمل كويري لجلب تغريدات الرجل مع تخطي عدد تغريداته ناقص 10
وبذلك يجلب لك آخر عشر تغريدات وللأسف هذا الحل وجدته بموقع ستاك اوفر فلو stackoverflow
بعد ما تعمقت قليلاً بالكويري الخاصة ب mongoDB تستطيع فعل ذلك بأمر واحد دون أن ترهق السيرفر وهو:
last_10_tweets_user = db.getCollection('statuses').find({'user.id_str': 'XXXXXXXX'}).sort({'$natural': -1}).limit(10)
قارنت الوقت بالعملية القديمة والعملية الجديدة العملية الاولى تاكل من الوقت قرابة ثلاث ثواني أو أكثر بقليل
العملية الثانية لا تاخذ سوى اجزاء من الثانية.
وهكذا المشروع لدي من وقتها لم يستهلك سوى 60 بالمية واقل من السيرفر
لم تعد تصلني الرسائل من الشركة
وقت المستغرق لانجاز مهمة بدل ثلاث ساعات أصبح ساعة ونصف
وتعلمت من ذلك:
1- عدم تطبيق أي حل مباشرة من stackoverflow نعم الكود يعمل لكن هنالك كود اكثر جودة منه :)
2- لا تفكر مباشرة برفع موارد السيرفر لأن ذلك يتطلب الكثير من المال، والمشكلة هي فقط بتعديل الكود.
أتمنى أنكم استفدتم من هذه القصة.
التعليقات (1)
شكرا على افادتنا بتجربتك ، تستحق أن نبقيها دائما خيار ممكن في حل بعض مشاكل الكود..شكرا
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !