تسجيل التخزين المؤقت من خلال MSMQ إلى خدمة الويب WCF

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

سؤال

لدي موقف مثير للاهتمام على يدي. منذ بضع سنوات، كان لدينا خدمة WCF تعمل على مربع IIS على شبكتنا التي نستخدمها لتسجيل الدخول. تستخدم التطبيقات BasichttpBinding لإرسال رسائل السجل وتسجيلها إلى قاعدة بيانات. يقتصر معظم تسجيلات جميع التطبيقات الأخرى على عدد قليل من سجلات الدفع لكل عملية. لقد قمنا مؤخرا على تطبيق تطبيق آخر لاستخدام خدمة التسجيل هذه. يسجل هذا التطبيق بقوة أكثر قليلا من أي من العملاء الآخرين لخدمة تسجيل الدخول لدينا. لديها عملية أن خلال مسارها يمكن أن تسجل أكثر من 100000 رسالة (وهذا هو لاستيراد 100000 سجل عبر ملف CSV).

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

ما أراه بعد تنفيذ MSMQ:

  • طلبي الذي يرسل السجلات إلى يعود MSMQ على الفور تقريبا (بدلا من انتظار تسجيل الدخول إلى أن تكون ملتزمة) وهذا ما أريد.
  • على الرغم من أنني أرسلت 1000 سجلات إلى تطبيق MSMQ في أقل من 30 ثواني، يستغرق عدة دقائق جميع سجلات 1000 لجعلها قاعدة البيانات. يبدو كما لو لي قائمة الانتظار لديها نوع من الاختناق ممكن أين يعيق طلبات السجل ولكن لا أعرف كيف / أين للتحقق من ذلك.
  • إذا كنت أستخدم net.tcp على الخادم تلقي سجلات الخدمة من خدمة MSMQ، أحصل على أخطاء Timeout Timeout Service و 90٪ فقط (أو نحو ذلك) من السجلات التي تصنعها إلى قاعدة البيانات ولكن إذا كنت أستخدم BasichttpBinding إنها تعمل موثوق.

    هنا هو الرمز في خدمة MSMQ الخاصة بي: giveacodicetagpre.

    هنا هو رمز لإنشاء خدمة MSMQ giveacodicetagpre.

    هنا هو الرمز في التطبيق الذي أستخدمه لاستدعاء خدمة MSMQ: giveacodicetagpre.

    أقدر أي مساعدة يمكن لأي شخص تقديمها. أنا ضائع قليلا في بالضبط ما مجموعة من الميزات المتاحة لي باستخدام MSMQ. لقد فعلت 6 أو نحو ذلك ساعات البحث عبر جوجل. معظم المستندات التي وجدتها قديمة جدا (2007) وهي قراءة صعبة. ربما يتوقعون مني أن أحصل على بعض مستوى المعرفة في هذا الموضوع.

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

المحلول

What you're seeing (if you're using net.msmq binding on your WCF) is what is designed to happen.

MSMQ, as a store-and-forward facility, will store messages in a queue at the sending client and the receiving server until either network or processing bandwidth is available. What this does is take load off the client (as you've observed) by making the process asynchronous.

You can view the statuses of the queues using Performance Monitor, the number of messages in the outbound queue (at the client) and the server queue are written to performance counters in realtime and can be viewed and/or logged.

If the performance is sub-optimal, you could look to change the WCF throttling settings to allow more concurrent connections in your service behaviour.

e.g.

<serviceThrottling
         maxConcurrentCalls="20"
         maxConcurrentSessions="20"
         maxConcurrentInstances="20"
       />

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