سؤال

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

يمكننا استخدام قاعدة البيانات (SQL Server 2005+ أوراكل 9+) و تحقيق أسهل المعاملات الدعم ، ولكن الطابور جزء يصبح أقبح.

لا الطريق يبدو كل كبيرة و مليئة سيئة gotchas حافة الحالات.

شخص ما يمكن أن نقدم بعض الإرشادات العملية في هذه المسألة ؟

أعتقد:E/C/A أو مهمة مجدولة المحرك الذي يستيقظ كل ذلك في كثير من الأحيان ومعرفة ما إذا كان هناك أي المهام المجدولة التي تحتاج إلى تشغيل في هذا الوقت (أيالتالي-تشغيل-التاريخ قد مرت ، ولكن انتهاء موعد لم يتم التوصل حتى الآن).

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

المحلول

لدينا نظام 60 أجهزة الكمبيوتر, كل تشغيل 12 المهام (المواضيع) التي تحتاج إلى "الحصول على الوظيفة التالية".كل ذلك يأتي إلى 50 ألف "وظيفة" في اليوم الواحد.تفعل الرياضيات على كيفية العديد من المعاملات في الدقيقة وتحقيق مهمة الوقت هو متغير ، لذلك فإنه من الممكن الحصول على العديد من "البوب" الأحداث في نفس الوقت.

كان لدينا أول نسخة باستخدام MSMQ.الخلاصة: البقاء بعيدا.في حين أنها لم تفعل ما يرام مع الحمل و مشاكل المزامنة ، 2 مشاكل.واحد مزعج واحدة اتفاق الكسارة.

مزعج: كما المشاريع والبرامج ، MSMQ وقد الاحتياجات الأمنية فقط جعله أكثر شيء واحد لاقامة والقتال مع العملاء الشبكة الادارية.

صفقة الكسارة: ثم جاء الوقت الذي يريد أن يأخذ المهمة التالية, ولكن ليس استخدام بسيط البوب ولكن شيئا مثل "الحصول على الأزرق القادم وظيفة" أو "الحصول على التالي الأصفر وظيفة".لا يمكن أن تفعل ذلك!

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

وأكدت اختبار مع 200 ألف رسائل في اليوم الواحد, عمل.ونحن يمكن أن تجعل من "التالي" منطق معقد كما نريد.

الصيد:عليك أن تكون حذرا جدا مع SQL أن يأخذ البند التالي.منذ كنت تريد أن تكون سريع وعدم تأمين.هناك 2 مهم جدا SQL تلميحات كنا استنادا إلى بعض البحوث.السحر يذهب شيء من هذا القبيل:

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

نصائح أخرى

لقد رأيت MSMQ يستخدم معاملات ولا يبدو معقدًا بشكل خاص - فقد ملف المعاملة المكالمات enqueue أو dequeue جنبًا إلى جنب مع الوصول إلى قاعدة البيانات ، وكان كل شيء على ما يرام طالما تم تعريف قائمة الانتظار على أنها معاملات بمجرد إنشاءها. لا أعتقد أن هذا صحيح مع ActiveMQ ، وهو وسيط رسائل ، ولكن يتم تثبيت MSMQ محليًا على كل جهاز نقطة النهاية ، لذا فإن الحصول على عنصر في قائمة الانتظار لا يتطلب معاملة موزعة فاخرة.

ربما تكون على دراية بهذا بالفعل ، ولكن على .NET هناك بعض المكتبات الخفيفة الوزن التي توفر بعض التجريدات اللطيفة على MSMQ (ونقل آخر من الناحية النظرية أيضًا)

nservicebus: www.nservicebus.com

النقل الجماعي : http://code.google.com/p/masstransit/

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

يمكنك أن تقرأ عن ذلك هنا: http://ayende.com/blog/archive/2008/08/01/rhino.queues.storage.disk.aspx

أيضًا ، لا يتعامل SQL Server 2005 إلى قائمة انتظار إلى حد ما ، باستخدام وسيط خدمة SQL Server ، ولكن ستحتاج إلى تثبيت SQL Server في كل نقطة نهاية ، ولا أعرف ما إذا كان SSB يعبر جدار الحماية.

أخيرًا ، إذا لم تحصل على الإجابة التي تبحث عنها هنا ، فإنني أوصي بشدة بمنتدى NserviceBus مناقشة. يجيب Udi Dahan على هذه الأنواع من الأسئلة إلى جانب مجموعة صغيرة من متابعي الرسائل ، وهو أفضل مورد وجدته حتى الآن لإجابة أسئلتي الموجهة نحو قائمة الانتظار بسرعة وكفاءة. هذا المنتدى هنا: http://tech.groups.yahoo.com/group/nservicebus/

Quartz.net هو نظام جدولة الوظائف مفتوح المصدر.

هذا هو ما تم تصميم MSMQ من أجله - في قائمة الانتظار مع المعاملات. إذا لم ينجح ذلك من أجلك ، تحقق من ميزة "Service Broker" لـ SQL Server - إنه "قائمة الانتظار في جدول SQL" الذي يصفه "CSMBA" في إجابته ، لكنه مكون خادم SQL متكامل ، معبأة بشكل جيد وتعرض لاستخدامك.

هل WebSphere MQ (سلسلة MQ) خيار؟ هو دعم المراسلة المعاملات.

يمكنك إلقاء نظرة على ميزة Oracle المسمى قائمة الانتظار المتقدمة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top