اذهب إلى المحتوى
  • 0

كيفية جعل وظيفة دورية في Node.js أسرع وأفضل

Kirolos Nagy2

السؤال

عندي موقع

المستخدم يشترك في باقه شهريه

انا استخدم طريقه حفظ رقم الايام للاشتراك وعمل Function تشتغل كل يوم بمكتبه node-cron

بيجيب جميع العملاء في الموقع وبينقص واحد من الرقم ده ولما يوصل لصفر بيوقف الخدمات 

هل فيه طريقه احسن من دي اني اعملها بشكل اسرع او احسن ؟

انا شغال Node

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

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

وذلك باستخدام نموذج بيانات بسيط يحتوي على حقل واحد لتاريخ انتهاء الاشتراك، ثم، استخدام تعبيرات SQL لتحديد العملاء الذين انتهت صلاحية اشتراكهم.

وكمثال استخدم العبارة التالية لتحديد العملاء الذين انتهت صلاحية اشتراكهم قبل يوم واحد:

SELECT *
FROM subscriptions
WHERE expiration_date < NOW() - INTERVAL 1 DAY

وهناك طريقة أخرى وهي بدلاً من استخدام مكتبة node-cron،  استخدم مؤقتات Node.js لتشغيل الوظيفة الدورية الخاصة بك، مما سيوفر لك تشغيل الوظيفة في الوقت المحدد بدقة أكبر.

 استخدم وظيفة setTimeout() أو setInterval()، لتشغيل الوظيفة الدورية الخاصة بك كل يوم في الساعة 12 منتصف الليل:

const subscriptionChecker = () => {
  // Do something
};

setTimeout(subscriptionChecker, 1000 * 60 * 60 * 24, 0); // Run the function every day at midnight

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أليس من الأفضل وضع جدول بيانات لإشتراكات المستخدمين بحيث يكون هناك علاقة بين المُستخدم و الإشتراكات (للمستخدم عدة إشتراكات) عندما يشترك المُستخدم في خطة ما تقوم بحفظ تاريخ اشتراكه و تاريخ إنتهاء الإشتراك حسب الخطة، في نموذج المستخدم تقوم بإنشاء تابع (hasValidSubscription) تقوم بالتحقق من خلاله إن كان المُستخدم لديه إشتراك صالح أم لا. داخل التابع تجلب آخر سجل إشتراك للمستخدم و تقارن خاصية تاريخ إنتهاء الإشتراك بالتاريخ الحالي و تُعيد قيمة منطقية تحدد إذا كان الإشتراك صالح أم لا. إن كان التاريخ الحالي أكبر ذلك معناه أن الإشتراك مزال صالح، و إذا كان العكس فالإشتراك منتهي.

ثم تستخدم التابع في عرض الصفحات التي توفر الخدمات في موقعك، قد يكون التابع عبارة عن طبقة وسيطة middleware تعمل في المسارات التي تحتاج إشتراك، بهذا الشكل إن كان المستخدم لديه إشتراك صالح ستسمح الطبقة الوسيطة بمروره، إن كان العكس فسيتم إعادة توجيهه مثلاً لصفحة تخبره أن الإشتراك منتهي و عليه تحديثه.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 39 دقائق مضت قال سمير عبود:

أليس من الأفضل وضع جدول بيانات لإشتراكات المستخدمين بحيث يكون هناك علاقة بين المُستخدم و الإشتراكات (للمستخدم عدة إشتراكات) عندما يشترك المُستخدم في خطة ما تقوم بحفظ تاريخ اشتراكه و تاريخ إنتهاء الإشتراك حسب الخطة، في نموذج المستخدم تقوم بإنشاء تابع (hasValidSubscription) تقوم بالتحقق من خلاله إن كان المُستخدم لديه إشتراك صالح أم لا. داخل التابع تجلب آخر سجل إشتراك للمستخدم و تقارن خاصية تاريخ إنتهاء الإشتراك بالتاريخ الحالي و تُعيد قيمة منطقية تحدد إذا كان الإشتراك صالح أم لا. إن كان التاريخ الحالي أكبر ذلك معناه أن الإشتراك مزال صالح، و إذا كان العكس فالإشتراك منتهي.

ثم تستخدم التابع في عرض الصفحات التي توفر الخدمات في موقعك، قد يكون التابع عبارة عن طبقة وسيطة middleware تعمل في المسارات التي تحتاج إشتراك، بهذا الشكل إن كان المستخدم لديه إشتراك صالح ستسمح الطبقة الوسيطة بمروره، إن كان العكس فسيتم إعادة توجيهه مثلاً لصفحة تخبره أن الإشتراك منتهي و عليه تحديثه.

ياعني باختصار اعمل middleware 

 

اعمل middleware تاني يجيب تاريخ الاشتراك الي هو مشترك فيه والتاريخ الحالي واقارن مبينهم صح كده ؟

تم التعديل في بواسطة Kerollos Nagy
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 13 دقائق مضت قال Kerollos Nagy:

اعمل middleware تاني يجيب تاريخ الاشتراك الي هو مشترك فيه والتاريخ الحالي واقارن مبينهم صح كده ؟

نعم هذا ما أقصد و ستعمل الطبقة الوسيطة تلقائياً مع أي مستخدم قد سجل دخوله في موقعك، أرى أن هذه الطريقة أفضل من جلب كل المستخدمين و إنقاص 1 من عدد الأيام بشكل دوري.

أيضاً يمكنك التوسع كأن تضع نموذجاً للخطط المتاحة (Plans) و كل خطة لها مدة معينة (شهر، 6 أشهر، سنة، مرة واحدة للأبد) و تربط نموذج الإشتراكات بنموذج الخطط.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

بالإضافة للإقتراحات السابقة يمكنك التفكير في الحلول التالية

  • استخدم قاعدة بيانات لتخزين معلومات العملاء والاشتراكات بدلاً من استخدام العداد المحلي. يمكنك استخدام MongoDB التي ذكرتها لتخزين معلومات العملاء والتحقق من حالة الاشتراكات. كما في التعليقات السابقة
  • بدلاً من استخدام node-cron في نفس الخادم الذي يستضيف موقعك، يمكنك استخدام خدمة خادم مجدولة مثل cron-job.org أو AWS Lambda أو Google Cloud Functions. ستقوم هذه الخدمات بتنفيذ وظائفك المجدولة بشكل مستقل عن الخادم الرئيسي، مما يساعد في تحسين أداء الموقع وتقليل الأعباء على الخادم الرئيسي.
  • قم بإنشاء واجهة برمجة التطبيق للتحقق من حالة الاشتراكات وتحديثها. يمكن للعملاء الاشتراك وإلغاء الاشتراك عبر هذه الواجهة، وبذلك يتم تحديث الحالة مباشرة في قاعدة البيانات بدلاً من الاعتماد على وظيفة مجدولة للتحقق من الحالة.
  • يفضل استخدام تقنيات الإشعار في الوقت الحقيقي مثل WebSocket أو Server-Sent Events لإبلاغ العملاء بتحديثات الاشتراكات على الفور، بدلاً من الانتظار حتى تنفيذ وظيفة مجدولة.
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...