هل من أحد إستخدم معلجة المهام الغير متزامنة ( Asynchronous Processing)

عند تطور الويب و تضخم البرمجيات جاءت الحاجة لمعالجة مهام خارج دورة http request and response و ذلك لعدة أشياء أهمها :

  • توجد عمليات تأخذ وقت كثير لكي تنفذ ( مثل إرسال بريد إلكتروني ، إنتاج ملف pdf على الخادم ... إلخ) .

  • إرسال بيانات بين نظامين مختلفين .

  • منظومة لتحليل تعاملات المستخدمين مع نظام محدد

  • ضع ما تراه مناسباً هنا

لكل هذه الاشياء وجدت طرق لمعالجة المهام الغير متزامنة .

  • فهل إستخدم أحدكم هذه الطريقة في أحد أنظمته التي يطورها ؟

  • و ما هي الادوات التي أستخدمت لتنفيذ هذه الالية ؟

  • و ما هي المهام التي إحتجتم لإستخدام هذه الالية لمعالجتها ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

استخدمت Queue Server لوضع الطلبات او ال messages. وهناك server آخر يقوم بقرائة وتنفيذ ال messages.

بعض العلميات مثل:

  • تصغير صور الأعضاء الى عدة مقاسات.

  • encoding .mp3 audio to other formats

  • عملية fan-out لل post الى جميع المتابعين.

  • حذف ال post من جميع المتابعين.

والسبب هو ان يكون ال HTTP response سريع وبالتالي user experience افضل واداء افضل للخادم

لكن بعض الطلبات تحتاج الى التخاطب مع server آخر للحصول على نيتجة، مثلا إنشاء unique id في distributed environment قد يتطلب الحصول على id من server اخر كما هو الحال مع تويتر. في هذه الحالة TCP socket هو الأسرع.

في حالة كان التخاطب داخليا على نفس السيرفر بين أكثر من process ، غالبا Shared Memory تكون كافية أو TCP socket ايضا مناسبة.

ما هو إسم Queue Server الذي إستخدمته ؟

مثلا إنشاء unique id في distributed environment

إذا كنت تستخدم uuid فلن تحتاج إلي هذا ، صحيح يا @sudanix ؟

SQS من امازون:

بالنسبة لل uuid مناسب في بعض الحالات، لكن لديه مشاكل:

1- غير قابل للترتيب.

2- حجمه كبير مقارنة بالحلول الأخرى. وبالتالي استهلاك أكبر لل storage و ال cache.

3- استخدامه ك primary key يشكل performance issues عند ال insert عندما يكبر حجم الجدول +Million records

4- شكله مزعج. مثلا

GET /user/sudanix/images/82fce7fc-cce3-4fd8-a550-6216bee969fe

عملت على تطبيق يتطلب الإتصال بأكثر من خادم في المتوسط 100 خادم ومتوسط 10 طلبات لكل خادم.

هذه العملية بالطريقة العادية التتابعية تتطلب وقت كبير جداً، والمفترض تنفيذ هذه المهمة دورياً عبر cronjob

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

لهذا الغرض إستخدمت مكتبة pthreads في لغة PHP وهذا موضوع بسيط عن كيفية عملها:

جزاك الله خيراً أخي ، بالنسبة للـ threads فهي مفيدة لزيادة أداء النظام ولكن هل تؤثر بشكل كبير على موارد النظام من ram , cpu ... إلخ ؟

كيف كانت تجربتك مع مكتبة pthreads بالنسبة لعملية التطوير ؟

  • بالطبع تؤثر على أداء النظام ولكن هذا الأمر نسبي على حسب مواصفات الخادم وعدد العمليات التي يتم تنفيذها في نفس الوقت ونسبة إستهلاك التطبيق ذاته من موارد النظام.

  • فليكن لدينا خادم بمعالج 3.0 جيجا هيرتز وذاكرة عشوائية 2 جيجا بايت ولدينا تطبيق يستهلك مقدار 0.5% من قدرة هذا المعالج ومقدار 0.7% من مقدار الذاكرة العشوائية ويتم تنفيذه في 1 ثانية فلو قمنا مثلاً بتنفيذ 100 عملية لهذا التطبيق فهذا يعني أننا نحتاج 100 ثانية بنفس معدل إستهلاك التطبيق للمعالج والذاكرة ولكن عندما نقوم بتنفيذ الـ 100 عملية عبر pthreads فهذا يعني إستهلاك 50% أي 1.5 جيجا هيرتز من قدرة هذا المعالج ونسبة 70% أي 1.4 جيجا بايت من مقدار الذاكرة العشوائية ويتم تنفيذ العمليات مجمعه في نفس الزمن اللازم لتنفيذ تطبيق واحد وهو 1 ثانية.

كيف كانت تجربتك مع مكتبة pthreads بالنسبة لعملية التطوير ؟

لا أعلم ما كنت سأفعل بدونها :)) وفرت وقت التنفيذ بشكل كبير جداً

غالبا لا يخلو موقع قمت ببرمجته منها واعتمد على cronjob لتنفيذ سكربتات معينه فى فترات معينه منها ماهو كل يوم مره ومنا ماهو كل دقيقه

ولكن إستخدام cronjobs يعني تأخر بعض العمليات عن وقتها إن كان وقت تنفيذ المهام كل مثلاً نصف ساعة ، صحيح يا @khashabawy ؟

و ما رأيك بتنفيذ المهام على أساس الاحداث ؟

وفقاً لما أقوم به لا يوجد تأخير .... هناك مهام أحتاج أن أقوم بها كل ساعه و هناك كل دقيقه و هناك كل عشرة دقائق و هناك كل يوم و هناك كل شهر

لا أعرف إن كنت تقصد ال threading أم ماذا .. لأن ال PHP لاتدعم ذلك إلا عن طريق إضافات plugins .. و لم أستخدمها و لكن وفقاً لما شاهدتهم يستخدمونها أنها مفيده جداً و موفره جداً للوقت فى حالة كانت المعالجة تحتاج إلى اجراءات كثيره و تنفيذها بشكل serial سيؤخر الحصول على نتيجه

كمثال :

لديك مدونه و عند إرسال تدوينه جديده بها ترين أن يتم :

1 - حفظها فى قاعدة البيانات و معالجة الصور التى تم رفعها ..

2 - مشاركتها على موقع تويتر ..

3 - مشاركتها على موقع فيسبوك ..

4- أمور أخرى ...

هذه الأمور لتنفيذها بالطرق العادية قد تأخذ حوالى 3 : 6 ثوانى حسب قوة السيرفر و إتصال الإنترنت .

إذا تم تنفيذها بإستخدام ال multi treading قد تأخذ من 0.5 : 2 ثانية .

PHP7 قد تضيف خصائص مذهلة بهذا الخصوص :

هذا رائع (كل هذه التحسينات في النسخة الجديدة من php) ولكن النسخة الغير مستقرة منها سوف تكون في نهاية هذه السنة ، اما بالنسبة لتبني الخوادم لها فستحتاج على الاقل الي سنتين أو أكثر

أنا لا أتكلم عن الـ multi threading أنا أتكلم عن background jobs .

شكراً مثال رائع

    فهل إستخدم أحدكم هذه الطريقة في أحد أنظمته التي يطورها ؟

استخدمتها كثيرا.

    و ما هي الادوات التي أستخدمت لتنفيذ هذه الالية ؟

الأفضل دوما, C++ مع Threads. استخدم C++ Builder, فى بعض الاحيان استخدم TThread الخاصة بVCL, أو استخدم الThreading الخاصة بويندوز من الAPI مباشرة. لأن المؤشرات و معالجة الذاكرة مهمة جدا للتطبيقات من هذا النوع.

        و ما هي المهام التي إحتجتم لإستخدام هذه الالية لمعالجتها ؟

الكثير, منها مثلا برنامج يعمل فى الخلفية System Account و يقوم باستقبال الطلبات من برامج اخرى Interface تؤدى الى تغيير طريقة عمله و تطلب منه بعض المعلومات. كل طلب جديد يفتح Thread و يقوم بمعالجة الطلب و ارسال النتائج الى الطالب.

الأساس فى تنفيذ برنامج Asynchronous جيد هو الحرص ان يكون كل خط معالجة Processing مستقل بذاته و لا يتداخل مع الخطوط الأخرى, هو الذى يتلقى الطلب و ينفذه بشكل مستقل تماما و كأنه برنامج مستقل.

إذا كنت تقصد ال background jobs الأعمال التي تتم في الخلفية فإستخدامها كبير جدا خصوصا مع تطبيقات الويب الحديثة أستخدمها في

بعض الأعمال حاليا خصوصا في إرسال البريد وتنفيذ الأعمال التي تأخذ وقت طويل لإنه من غير المتوقع جعل المستخدم ينتظر حتى ينتهي تنفيذ عملية

على سبيل المثال إنشاء وعرض تقرير PDF.

كمطور rails أستخدم مكتبات GEMS تساعد على تنفيذ هذه العمليات يمكنك الإطلاع عليها من خلال هذا الرابط

موفق

هل تستخدم هذه الاداة الـ queues ؟

يوجد عدة أدوات في الرابط الذي ذكرت لك غالبا جميعها تستخدم queues بطريقة أو أخرى.

يقصد ال parallele programming و تنفيذ ال background tasks و ليس ال threading او ال periodic tasks, ان كنت من مبرمجي ال python يمكنك الاطلاع على Celery كما يمكنك ربطه مع redis او اي message queueing مثلا RabbitMQ او غيره, و يكمن استخدام هذه الالية في كثير من المهام من ارسال ايميلات في حالة تسجيل عضو جديد او غيرها من المهام التي تحتاج الى ارسال الايميلات او تنفيد عمليات معينة على الصور و كل هذا فقط من أجل أداء الموقع و سرعتة هي مسألة performance لا غير.

هل جربت إستخدام Message Queue Server مثل RabbitMQ مع تطبيق ويب ؟

نعم استخدمت Celery مع تطبيق ويب مبني على Django و ك Borker ل Celery استخدمت RabbitMQ يمكنك قراءة المزيد عنه من هنا ان كنت تستخدم ال Python في الرابط التالي

هل تنصحني بكتب أو مواد مرئية أو حتى مصادر برمجية لمعرفة المفاهيم الاساسية لإستخدام Message Queue Service مثل RabbitMQ ( يا حبذا لو كانت تتعامل مع PHP ) ؟

كل شيء مشروح في موقعهم و هناك مكتبة php للتعامل معه انظر هنا

جزاك الله خيرا