هل هناك طريقة "لطيفة" للتعامل مع إعادة تجميع البث المتعدد من مصادر متعددة؟

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

سؤال

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

السبب في أن الكود معقد ومعرض للخطأ هو أنه يستخدم عددًا من المخازن المؤقتة الأولية لإعادة تجميع تدفقات البث المتعدد وفقًا للمكان الذي أتوا منه. يبدو أنه حتى مع Boost.Asio ، سأضطر إلى التعامل مع هذه المشكلة نفسها ، لذلك قبل أن أتعثر في أنني اعتقدت أنه من المفيد أن أسأل كيف تعامل الآخرون مع هذا الموقف.

يبدو وكأنه حالة استخدام شائعة جدا. هل هناك أي شيء يمكن أن يساعدني في القيام بهذه المهمة بدون نوع الكود الذي لدي الآن؟ أم أن هناك قالب C ++ المعمول به (تعزيز أو غير ذلك) يمكنه القيام بهذا النوع من العمل؟

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

شكرا مقدما على أي أفكار حول هذا الأمر.

جيمي

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

المحلول

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

  • إذا كنت تستخدم البث المتعدد UDP RAW ، فمن المحتمل أنك تقوم بعمل نوع من تسلسل البروتوكول في مساحة المستخدمين من أجل التعامل مع الحزم المفقودة أو المكررة. مهما كانت التحسينات التي تريد القيام بها ، مقاومة الإغراء لكسر الطبقات بين تطبيقك وطبقة البروتوكول.
  • std::vector, ، بالنسبة لمعظم الأغراض ، مطابقة لخسارة حرف خام مخصصة ديناميكيًا. لا تخجل من استخدامه لمجرد أنها طبقة تجريدية. هناك حالتان يجب أن تتجنبهما ، ولكن:
    • إذا تمكنت من التخلص من المخازن المؤقتة المخصصة بشكل ثابت
    • إذا كنت بحاجة إلى نقل ملكية المخزن المؤقت في اتجاه مجرى النهر (على الرغم من أنك إذا قمت بتصميم FUREY ، swap() قد تكون كافية)
  • Preallocation هو صديقك. إذا تمكنت من الحصول على مجموعة من المخازن المؤقتة المتاحة للاستخدام عند ظهور البيانات ، فيمكنك إزالة التخصيص الأكثر ديناميكية من المسار السريع للتنفيذ.
  • تقليل نسخ الذاكرة. إذا تمكنت من معالجة البيانات في مكدس استدعاء واحد ، فلديك فرصة لتجنب النسخ. إذا كان عليك نقل البيانات إلى مؤشر ترابط مختلف ، فقد تضطر إلى نسخ البيانات.
  • إذا تمكن التطبيق الخاص بك من التعامل مع المخازن المؤقتة المكثفة (بدلاً من تجميع جميع البيانات writev و readv.

لا أعتقد أن أي حل معلوم سيحل مشاكلك. تعزيز أسيو ، libevent, ، وما إلى ذلك ، سوف يتعاملون مع تجريدات المقبس لك ، ولكن ما تفعله ببياناتك لا يزال مسؤوليتك ، بمجرد تسليمها.

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