باستخدام قوائم قوائم رسائل POSIX بدلاً من مآخذ TCP - كيفية إنشاء "اتصال"؟

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

سؤال

لديّ برامج عميل وخادم تتواصل الآن عبر TCP. أحاول استخدام قوائم قوائم رسائل Posix بدلاً من ذلك (في الحالات التي يكون فيها العميل والخادم على نفس الجهاز ، بالطبع). آمل أن يحسن الأداء (على وجه التحديد عن طريق انخفاض الكمون).

لقد عملت معظمها ، لكنني لست متأكدًا من شيء واحد: كيفية إنشاء "الاتصال". يقبل الخادم الاتصالات من عملاء متعددين بشكل متزامن ، لذلك أنا مغر بمحاكاة اتصال TCP لتأسيس عملية مثل ذلك:

  1. يفتح الخادم قائمة انتظار مع اسم معروف ويقرأ منه بشكل مستمر (يمكنه استخدامه select(2) كما هو الحال مع TCP).
  2. يفتح العميل ثلاث قوائم: اثنان مع أسماء تعسفي (بما في ذلك بعض التفرد مثل PID لتجنب الاصطدامات) ، وواحد مع الاسم المعروف الذي يستخدمه الخادم.
  3. ينشر العميل رسالة "Connect" إلى قائمة انتظار الخادم ، بما في ذلك أسماء قائمة انتظار العميل (يتم تعيين أحدهم لحركة مرور العميل والخادم والآخر للعكس).
  4. يفتح Server قوائم الانتظار المذكورة في رسالة Connect الخاصة بالعميل ويبدأ في القراءة (حدد) من واحد إلى خادم واحد.
  5. يقوم العميل بإغلاق قائمة انتظار الخادم بالاسم المعروف. يستمر الاتصال في اتجاهين باستخدام قوائم الانتظار التي أطلق عليها العميل (واحدة لكل اتجاه).

ربما يمكنك أن ترى كيف يشبه هذا المخطط طريقة TCP المشتركة ، وهذا ليس مصادفة. ومع ذلك ، أود أن أعرف:

  1. هل يمكنك التفكير في طريقة أفضل للقيام بذلك؟
  2. هل ترى أي مشاكل محتملة في طريقتي؟
  3. هل لديك أي أفكار أخرى ، بما في ذلك احتمال استخدام قوائم قوائم الرسائل بدلاً من TCP على نفس الجهاز سيؤدي بالفعل إلى تحسين الأداء (الكمون)؟

ضع في اعتبارك أنني لم أستخدم قوائم قوائم رسائل Posix من قبل (لقد استخدمت IBM WebSphere MQ لفترة من الوقت ، لكن هذا مختلف إلى حد ما). المنصة هي Linux.

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

المحلول 2

انتهى بي الأمر بتنفيذها بشكل أساسي كما وصفت ، مع بعض التحسينات:

  • في الخطوة 2 ، استخدمت GUIDS لأسماء قائمة الانتظار بدلاً من دمج PID للعميل.
  • في الخطوة 4 ، أضفت إرسال رسالة "قبول" من الخادم إلى العميل.
  • عندما يرغب أي من الجانبين في إنهاء الاتصال ، فإنه يرسل رسالة "فصل".

المصافحة أبسط من TCP ، ولكن يبدو كافيًا.

أما بالنسبة للاضطراب: إنه أفضل بكثير. أقل بنسبة 75 ٪ أقل من زمن انتقال باستخدام قوائم رسائل POSIX بدلاً من TCP على نفس الجهاز. رسائلي على ترتيب 100 بايت لكل منهما.

نصائح أخرى

  1. هل يمكنك التفكير في طريقة أفضل للقيام بذلك؟

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

  2. هل ترى أي مشاكل محتملة في طريقتي؟

    قوائم رسائل System V و FIFO المسمى على حد سواء على ما يرام. تشبه أنابيب FIFO الأنابيب العادية حتى تتمكن من قراءة () والكتابة () مع الحد الأدنى من التغييرات في التعليمات البرمجية. تتطلب قوائم رسائل النظام V وضع البيانات في بنية واستدعاء MSGSND (). أي منهما سيكون على ما يرام.

  3. هل لديك أي أفكار أخرى ، بما في ذلك احتمال استخدام قوائم قوائم الرسائل بدلاً من TCP على نفس الجهاز سيؤدي بالفعل إلى تحسين الأداء (الكمون)؟

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

    ليس لدي أي فكرة عن التقنية التي تمنحك الإنتاجية المثلى في برنامجك. قد لا يكون من المفيد حقًا استخدام قوائم رسائل System v ولكن يمكنك اتخاذ هذا القرار فقط.

فيلوميناتي

قارنت أداء Posix MQ وزوج من مآخذ TCP/IP.

يحتوي البرنامج التجريبي على خيوطان واحد للكتابة والآخر للقراءة.

والنتيجة هي أن Posix MQ أسرع ،

  • MQ 460000 TPS
  • SocketPair 400000 TPS

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

هل قارنت الحل المستند إلى POSIX-MQ مع مآخذ UNIX المحلية أو مآخذ TCP فقط؟

شكرًا

كيف فعلت هذا عندما لا يعمل Select () على قوائم قوائم الرسائل؟ ما هو sys v أو posix؟ لماذا تبذل الجهد الإضافي في إنشاء GUID إلى جدول البحث PID عندما يكون PID مضمونًا ليكون فريدًا ، وهل تخزين أصغر (عدد صحيح)؟

/بلي/

يمكنك أيضًا استخدام قوائم قوائم الرسائل لـ IPC في البرامج الموجودة على أجهزة مختلفة ، في مثل هذه الحالات ، يمكنك استخدام ZeromQ (http://www.zeromq.org) أو غيرها من واجهات برمجة تطبيقات قائمة انتظار الرسائل ، أقترح عليك أيضًا التفكير فيها ، واختبارها أيضًا.

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