كيفية تسليم مقبس الاستماع TCP مع الحد الأدنى للتوقف؟

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

سؤال

في حين أن هذا السؤال هو وضع علامة حفثة الحدث، حلول مأخذ BSD العامة بأي لغة موضع تقدير كبير.


بعض الخلفية:

لدي تطبيق يستمع على مقبس TCP. يتم تشغيله وإيقافه باستخدام برنامج System System STYSTION النظام.

مشكلتي هي أنه يحتاج إلى بعض الوقت للبدء قبل أن تكون جاهزا لخدمة مقبس TCP. إنها ليست طويلة جدا، ربما فقط 5 ثوان، ولكن هذا هو 5 ثوان لفترة طويلة جدا عند إجراء إعادة التشغيل خلال يوم عمل. من الأهمية بمكان أن تظل الروابط الحالية مفتوحة وتنتهي بشكل طبيعي.

أسباب إعادة تشغيل التطبيق عبارة عن بقع، ترقيات، وما شابه ذلك. لسوء الحظ، أجد نفسي في وضع ذلك، في كل فترة، أحتاج إلى القيام بهذا النوع من الأشياء في الإنتاج.


السؤال:

أبحث عن طريقة للقيام بتسليم أنيق مقبس الاستماع TCP، من عملية إلى أخرى، ونتيجة لذلك، تحصل على ثانية فقط من وقت التوقف. أود أن تظل الاتصالات / المقابس الحالية للبقاء مفتوحا وإنهاء المعالجة في العملية القديمة، في حين أن العملية الجديدة تبدأ خدمة Connectinos الجديدة.

هل هناك بعض الطريقة المثبتة للقيام بذلك باستخدام مآخذ BSD؟ (نقاط المكافأة لحل EventMachine.)

هل هناك مكتبات مفتوحة المصدر هناك تنفيذ هذا، وأستطيع استخدامها كما هي، أو استخدام كمرجع؟ (مرة أخرى، يتم تقدير حلول غير Ruby وغير الحفثة أيضا!)

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

المحلول

هناك عدة طرق للقيام بذلك دون توقف، مع التعديلات المناسبة لبرنامج الخادم.

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

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

نصائح أخرى

كتب جان بول كالديرون عرض مفصل في عام 2004 على حل شامل لمشكلتك باستخدام الملتوية، بما في ذلك ترحيل المقبس وغيرها من القضايا.

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