คำถามคือสิ่งที่เกิดขึ้นจริงเมื่อคุณเรียกใช้คำขอ HTTP ขาออก 1k-2k ฉันเห็นว่ามันจะแก้ปัญหาการเชื่อมต่อทั้งหมดได้อย่างง่ายดายด้วยการเชื่อมต่อ 500 ครั้ง แต่การขยับขึ้นจากที่นั่นดูเหมือนจะทำให้เกิดปัญหาเนื่องจากการเชื่อมต่อถูกเปิดทิ้งไว้และแอป Node จะติดอยู่ที่นั่น ทดสอบกับเซิร์ฟเวอร์ในพื้นที่ + ตัวอย่าง Google และเซิร์ฟเวอร์จำลองอื่น ๆ
ดังนั้นด้วยจุดปลายเซิร์ฟเวอร์ที่แตกต่างกันฉันได้รับเหตุผล: อ่าน ECONNRESET ซึ่งเป็นเรื่องดีที่เซิร์ฟเวอร์ไม่สามารถจัดการคำขอและส่งข้อผิดพลาดได้ ในช่วงคำขอ 1k-2k โปรแกรมจะหยุดทำงาน เมื่อคุณตรวจสอบการเชื่อมต่อที่เปิดอยู่lsof -r 2 -i -a
คุณจะเห็นว่ามีจำนวนการเชื่อมต่อ X จำนวนหนึ่งที่ค้างอยู่ที่นั่น0t0 TCP 192.168.0.20:54831->lk-in-f100.1e100.net:https (ESTABLISHED)
ของการเชื่อมต่อที่ให้แขวนมี เมื่อคุณเพิ่มการตั้งค่าการหมดเวลาให้กับการร้องขอสิ่งเหล่านี้อาจจบลงด้วยข้อผิดพลาดการหมดเวลา แต่ทำไมไม่เช่นนั้นการเชื่อมต่อจะถูกเก็บไว้ตลอดไปและโปรแกรมหลักจะสิ้นสุดในสถานะที่ถูกลืมบางอย่าง
รหัสตัวอย่าง:
import fetch from 'node-fetch';
(async () => {
const promises = Array(1000).fill(1).map(async (_value, index) => {
const url = 'https://google.com';
const response = await fetch(url, {
// timeout: 15e3,
// headers: { Connection: 'keep-alive' }
});
if (response.statusText !== 'OK') {
console.log('No ok received', index);
}
return response;
})
try {
await Promise.all(promises);
} catch (e) {
console.error(e);
}
console.log('Done');
})();
npx envinfo
ใช้งานตัวอย่างของคุณในสคริปต์ Win 10 / nodev10.16.0 ของฉันสิ้นสุดใน 8432.805ms