منذ أن قام نظام SEOTcs بتحديث خوارزمية تسجيل تحسين محركات البحث (SEO) في 24 نوفمبر، ظهرت مشكلة تزعجني غالبًا ما يتم الإبلاغ عن الخطأ التالي أثناء تنفيذ مهمة وظيفة بيانات Java:
"2011-12-03 18:00:32 DefaultHttpClient [INFO] تم اكتشاف استثناء الإدخال/الإخراج (java.net.SocketException) عند معالجة الطلب: إعادة تعيين الاتصال بواسطة النظير: خطأ في كتابة مأخذ التوصيل
2011-12-03 18:00:32 DefaultHttpClient [INFO] إعادة محاولة الطلب"...
ولتحقيق هذه الغاية، قمت بالبحث في بعض مواقع الويب باللغتين الصينية والإنجليزية، وبحثت في كل زاوية يمكنني العثور عليها، واكتشفت سبب حدوث هذا الاستثناء في Java على جانبي العميل والخادم سببين:
1. إذا كان المقبس في أحد طرفيه مغلقًا (أو مغلقًا بشكل نشط، أو مغلقًا بسبب خروج غير طبيعي)، فسيظل الطرف الآخر يرسل البيانات، وستؤدي حزمة البيانات الأولى المرسلة إلى تشغيل هذا الاستثناء (إعادة تعيين الاتصال بواسطة النظير).
2. يخرج أحد الطرفين، ولكن لا يتم إغلاق الاتصال عند الخروج. إذا كان الطرف الآخر يقرأ البيانات من الاتصال، فسيتم طرح الاستثناء (إعادة تعيين الاتصال). ببساطة، يحدث ذلك بسبب عمليات القراءة والكتابة بعد قطع الاتصال.
لذلك اعتقدت ببساطة أنه يمكن حل المشكلة عن طريق تعيين بعض مهلات المقبس:
ولكن بعد إعداد الوضع لا يزال هو نفسه.
لقد أزعجتني هذه المشكلة لعدة أيام، وكنت أفكر وأجري اختبارات مقارنة كل يوم من أجل اكتشاف الكود الذي تسبب في هذه المشكلة، ولا يسعني إلا أن أفكر في السبب وراء نفس العدد من الكلمات الرئيسية لم يكن هناك أي خطأ في بيانات ترتيب الاستعلام الدفعي السابق، ولكن تم الإبلاغ عن الأخطاء بشكل متكرر مؤخرًا، لماذا هذا؟ هل يحظر موقع الواجهة المطلوبة عنوان IP لخادمنا؟ هذا السبب ليس كافيًا جدًا، ولا بد أن يكون سببه الفشل في تحرير الاتصال بشكل صحيح في مكان ما في البرنامج!
بتوجيه من هذه الفكرة، وبعد عدة أيام من العمل الجاد والممارسة المستمرة، اكتشفت اليوم أخيرًا جوهر المشكلة التي تسببها طريقة المؤقت! الوضع على هذا النحو في الأيام القليلة الماضية، قمت يدويًا بتشغيل بعض المهام المجمعة ووجدت أنه عندما تكون قيمة تصنيف المرشح 100، فإن الخطأ java.net.SocketException: سيستمر ظهور إعادة تعيين الاتصال في Java، وستظهر الشاشة. التحديث قوي بشكل خاص، بعد مقارنة رمز المؤقت هذا بعناية
وأخيرا، أدركت فجأة، نعم! هناك مشكلة هنا، دعوني أحللها بنفسي:
قيمة دالة، القيمة التي ترجعها هي قيمة حرجة، ولكن في طريقة المؤقت الخاصة بي، يتم الحكم على أنه إذا كانت القيمة التي يتم إرجاعها قيمة حرجة، فسوف تجبرها على الاستمرار في تنفيذ تلك الطريقة خلال 10 ثوانٍ، وهذه الطريقة هي للحصول على بيانات محددة من التعليمات البرمجية المصدر في صفحة ما، فإن كل تنفيذ لهذه الطريقة سوف يستهلك عشرات المللي ثانية، وهو ما يعادل إنشاء اتصال مأخذ توصيل خلال هذا الوقت، ولكن لأنه دائمًا ما يُرجع القيمة الحرجة، لذلك ستستمر هذه الطريقة بشكل مستمر قم بإنشاء اتصال مأخذ توصيل في غضون 10 ثوانٍ للحصول على البيانات، إذا استغرق تنفيذ هذه الطريقة حوالي 80 مللي ثانية في كل مرة (بعد الاختبار، يبلغ وقت تنفيذ كل طريقة حوالي 80 مللي ثانية)، خلال 10 ثوانٍ خلال هذا الوقت، 10*1000/80 =. سيتم إنشاء 125 اتصال مأخذ توصيل، أي أنه سيتم إنشاء 12.5 اتصال مأخذ توصيل في الثانية، بالإضافة إلى ذلك، نظرًا لأن هذا برنامج تصفية، فستظهر قيم حرجة متعددة معًا بشكل مستمر، لذلك، في بضع ثوانٍ، سيتم إنشاء عدد المقابس. سترتفع الاتصالات بنفس صفحة الموقع الإلكتروني بشكل كبير جدًا، حيث تصل إلى المئات أو حتى الآلاف، مما يؤدي إلى ارتفاع عدد اتصالات الطلب التي تنتظر المعالجة بشكل كبير جدًا:
لماذا استخدمت طريقة المؤقت هذه لتنفيذ طريقة ما في المقام الأول؟ كان السبب هو الحصول على قيمة ثابتة للبيانات، ولكن الآن بعد أن فكرت في الأمر، فإن التأثير السلبي مكلف للغاية ولا يمكن الاستهانة بالتأثير. ولكن بعد عدة أيام من التحليل والاختبار الشامل، تم اكتشاف الجاني أخيرًا وبعد حل المشكلة، شعر ذهني فجأة بالارتياح وتمكنت من النوم بسلام. . .