سؤال

يجب أن أحصل على أقصى أداء الإنتاجية في خدمة WCF الخاصة بي. في إحدى اختباراتي، حصلت الخدمة أدناه فقط على عناصر بيانات 50K في الدقيقة باستخدام Nettcpbinding. هل سيتم ربط ملزمة منفصلة مثل netmsmqbinding هذا الأداء؟

تستخدم الخدمة والعميل WCF وتشغيلها بنفس الجهاز.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
    protected List<int> _data = new List<int>();

    public void Insert(int[] data)
    {
        lock (_data)
        {
            _data.AddRange(data);
        }
    }

    public int[] Get()
    {
        lock (_data)
        {
            return _data.ToArray();
        }
    }
}

الرمز أعلاه هو نسخة مبسطة من التعليمات البرمجية الفعلية.

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

المحلول

من المرجح أن يكون MSMQ أبطأ من TCPBILTING.

إذا كنت تعمل على نفس الجهاز، فيمكنك بالتأكيد استخدام NetNamedPipeIbinding (IPC) وهو أسرع ربط متاح.

يجب عليك أيضا التحقق من كيفية تسلسل بياناتك. البروتوكول المخزن المؤقت تسلسل أسرع بكثير (وأجهزة صوتية) من التقدم الثنائي الافتراضي WCF (ولكن يتطلب القليل من التغيير والتبديل).

نصائح أخرى

أسرع للحصول على مكالمة واحدة في العزلة، أو لفيضان من الآلاف من المكالمات؟

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

NETTCP من ناحية أخرى مثل HTTP - أسرع فقط. يمكنك إرسال طلب إلى الخدمة واسترجع استجابة (إذا سارت الأمور على ما يرام) على الفور. لا توجد قائمة انتظار الرسائل في حد ذاتها تشارك، رسائلك هي طلب / الرد.

لذلك لا أعتقد أنه يمكنك مقارنة الارتياحتين، حقا. أنها تخدم أغراض مختلفة تماما:

  • إذا كنت ترغب في البحث عن الرمز البريدي واسترجع خط الطول / خط العرض لهذا الموقع، فأنت بالتأكيد تريد آلية طلب / استجابة -> استخدام NETTCP

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

نأمل أن يجعل الأمور أكثر وضوحا قليلا - لا أعتقد أن هذين اثنين حقا موجهة نحو نفس مجموعة العمليات، لذلك لن تضطر على الأرجح إلى أي وقت مضى الاختيار بين هذين :)

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

هل لديك سبب للاعتقاد بأن النقل هو ما تباطأ معدل المعاملات؟ ماذا قال لك التنميط؟ في الوقت الحالي، يتم تعيين هذه الخدمة لتكون خيوط واحدة، ولديها أيضا مكالمات متعددة "احصل على" قفل بعضها البعض.

كيف يتم استدعاء هذه الخدمة / المستخدمة؟ هل يساعد ذلك في جعله متعدد الخيوط؟ ماذا عن استخدام قفل أكثر تطورا مثل ReaderWriterLock الذي يسمح بتحدث مكالمات متعددة للتعدد في نفس الوقت، ولكن لا يزال يحظر "إضافة"؟

تحرير: أعرف أن هذا وضع مبسط، لكن هل الخدمة الفعلي تنفذ من نفس الاعتبارات؟

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