كيف يمكنني القيام بالأحداث المستندة إلى الوقت/المجدولة في .NET؟

StackOverflow https://stackoverflow.com/questions/1015945

سؤال

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

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

ما هي بعض الحلول الشائعة للتعامل مع هذا؟

أنا أستخدم .NET 3.5 SP1.قاعدة البيانات هي Sql Server 2008.ستكون واجهة المستخدم مستندة إلى الويب بالرغم من ذلك.

لم أكن متأكدًا مما إذا كان الأشخاص يستخدمون MSMQ؟أو شيء مدمج في Sql Server؟أو بعض المكتبات مفتوحة المصدر (على سبيل المثال. كوارتز.نت) مع خدمة NT.سيكون الخادم هو الإصدار القياسي لنظام التشغيل Windows 2008.

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

وأخيراً وهذا هدف ثانوي..أحب أن أرمي هذا إلى اللازوردية من أجل الضحك والضحك ...فهل هذا ممكن أيضا؟إنها مجرد فكرة لقائمة الرغبات.أفضل القيام بذلك في صندوق مخصص إذا كان الحل أسهل من استخدام Azure.

هتافات :)

يحرر:المنطق الذي يجب معالجته عند الحاجة إلى إطلاق حدث ما، هو وظائف خلفية.لا واجهة المستخدم المطلوبة.

هل كانت مفيدة؟

المحلول

وQuartz.NET ربما يمكن أيضا التعامل مع هذه المتطلبات بشكل جيد. فوائد أرى هي في طرق مختلفة لوضع جدولة (التقويمات CronTrigger +) والقدرة على الحصول على فرص العمل الخاص بك في وحدات صغيرة من التعليمات البرمجية قابلة للاختبار (وظيفة).

وQuartz.NET يتيح لك ايضا توزيع اللازمة وتجاوز الفشل مع ميزات المجموعات. ميزة واحدة لطيفة هي أيضا لكل الزناد شكلي معالجة اختل الاجهزة التي تعطيك الفرصة للرد على اخطأت الهدف وجدولة أسفل الوقت.

وSQL خدمة وسيط يبدو أن صالح لم الاقتراع، وأتساءل عما إذا كان ذلك سوف يكون من أي وقت مضى القضية على الرغم من وسيط لديه عيب سبر معقدة بعض الشيء (على الأقل من وصف قرأت أعلاه).

وفقط بلدي منحازة $ 0.02.

نصائح أخرى

مؤسسة سير العمل يمكن القيام بذلك. استخدام تأخير النشاط أو تعيين زمنية ل(DesiredTimeOfExecution - الآن) . لأنظمة نطاق أوسع، تعيين UnloadOnIdle إلى true، وسيتم استمر سير العمل في انتظار لحين الحاجة إليها.

إليك مثال بسيط جدا لتأخير آخر .

وWF هو حر ، تضمينها كجزء من إطار عمل .NET 3.0.

وما تريده هو SQL خادم خدمة وسيط.

ويمكنك القيام الوصول توقيت قاعدة بيانات للاستعلام عن بيانات التقويم، وما إلى ذلك أنها تقوم برسالة-و، أقوى من MSMQ، لا يتطلب الاقتراع، ويمكن استخدامها في بيئات موزعة إذا كان هذا هو ما تحتاجه. يعمل كبيرة بالنسبة لي!

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

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

وهنا المقارنة: خدمة SQL الوسيط مقابل MSMQ

وSO من شأنها أن تسمح لي فقط للنشر وصلة واحدة لسوء الحظ. إلا أنني يمكن أن تشير لك المزيد من الموارد لمساعدتك على البدء مع SSB.

وآمل أن يساعد هذا!

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

إذا كنت تريد الأفضل في عالمي .NET وSQL Server، فيمكنك ذلك استخدم وظائف SQL واستدعاء التعليمات البرمجية المُدارة أيضًا.ليس لدي أي خبرة في هذا الحل، لذا أعتذر مقدمًا إذا لم يكن المورد الذي قدمته دقيقًا للغاية.

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

يحرر

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

وأنت تسير في حاجة إلى جدولة العمل ومدير العمل منذ كان لديك تحبب صغير وعليك أن القدرة على معرفة مسبقا ما إذا كانت جميع الوظائف التي تحدث في لحظة معينة سوف ينتهي كل دقيقة القادمة.

وهذا يجعل مهمة جدولة سهلة. يجب أن يكون لديك جدول DB الذي يخزن فرص العمل الخاص بك وكل دقيقة لها خدمة جدولة الوظائف تذهب إلى هذا الجدول وحدد الوظائف التي تحتاج إلى القيام به.

وسيكون إدراج بقائمة الانتظار تلك الوظائف مع مدير العمل. هل يمكن استخدام جدول آخر أو قائمة انتظار معاملات لإدراج بقائمة الانتظار وظيفتك. خدمة إدارة عملك ومراقبة قائمة انتظار العمل. يمكنك القوائم الخاصة بك أو استخدام BizTalk لمراقبة قائمة انتظار العمل و انطلاق التزامن أو سير العمل . فإنه سيتم سحب المهام من قائمة الانتظار واحدا تلو الآخر، والقيام بالمهام وتحديث حالة المهمة في DB.

والقضية سوف يكون لديك قابلية اعتمادا على عدد من المستخدمين، وعدد من المهام التي إدراج بقائمة الانتظار وكيف مكثفة (الوقت والذاكرة، وحدة المعالجة المركزية، وما إلى ذلك) يسمح لكل مهمة أن يكون. لو كنت أنت، وأود أن دفع مرة أخرى على تحبب الساعة 1 دقيقة ودفعها إلى 5 دقائق. ماذا تحتاج القيام به في 01:38 ان كنت لا تستطيع الانتظار حتى 01:40 إلى عن على؟ :)

وهذا هو بالفعل مشكلة ناقش على ستاكوفيرفلوو. يرجى الدخول من خلال تحتاج جدولة الوظائف في asp.net

وأنت نسيت أن أضيف أهم جزء من المعلومات في سؤالك - ASP.Net

ويصف إطار جدولة لتطبيقات الويب ASp.Net التي يمكن تشغيلها مثل خدمة وتعطيك الطريقة التي دوريا يحصل على استدعاء ثم يمكنك اطلاق النار المنطق الخاص لتحميل الأحداث، قائمة الانتظار تلك صالح باستخدام أجهزة ضبط الوقت.

وأيضا، وهذا واحد هو أقل من جميع البدائل. نأمل أن يكون هذا هو ما كنت في حاجة.

يعتمد الأمر قليلاً على طبيعة النظام.العمل على افتراض أن التعريف الكامل للأحداث مخزن في قاعدة البيانات:

  • إذا كان الحدث يحتاج إلى التسبب في شيء ما في واجهة مستخدم الويب، فعند التحديثات، تحقق من الجدول بحثًا عن الإدخالات التي "حدثت" وأضف المؤشرات / الشاشات / النوافذ المنبثقة المناسبة إلى مخرجات طلب الويب التالية.
  • إذا كانت الأحداث الخاصة بك تتعلق بمعالجة الخلفية، فإن الحل الأبسط هو كتابة تطبيق .NET مستقل يقوم باستقصاء جدول أحداث قاعدة البيانات بحثًا عن سجلات جديدة، والتحقق من الساعة لمعرفة الأحداث التي حدثت.يمكنك أن تتوهم وتشتمل على الترابط إذا تسببت بعض الأحداث في تشغيل عمليات طويلة، وما إلى ذلك.ولكن هذا سيكون التصميم الأساسي.(استخدم الخيط فقط إذا كان عليك ذلك...سيكون التطبيق البسيط ذو الخيط الواحد الذي يستطلع الجدول هو الأكثر قوة)
<اقتباس فقرة>   

وبعد ذلك أنا التخمين وأنا سوف تضاف حدث / وظيفة في مكان ما، والتي سوف تحتوي على المفتاح الرئيسي للجدول قاعدة البيانات. عند هذا الحدث هو أن يكون أطلق النار، وأنا انتزاع تلك المعلومات من ديسيبل، ثم القيام المنطق.

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

SELECT * FROM Events WHERE Events.Time < next_minute
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top