ไม่มีกระสุนเงิน
ในทางปฏิบัติมันขึ้นอยู่กับ ...
tl; dr - วิธีแก้ง่ายใช้ nginx ...
การปิดกั้น:
ตัวอย่างเช่น Apache โดยค่าเริ่มต้นใช้รูปแบบการปิดกั้นที่กระบวนการจะแยกสำหรับทุกการเชื่อมต่อ นั่นหมายความว่าทุกการเชื่อมต่อต้องการพื้นที่หน่วยความจำของตัวเองและจำนวนค่าโสหุ้ยการสลับบริบทจะเพิ่มขึ้นตามจำนวนการเชื่อมต่อที่เพิ่มขึ้น แต่ข้อดีคือเมื่อการเชื่อมต่อถูกปิดบริบทสามารถกำจัดและหน่วยความจำใด ๆ / ทั้งหมดสามารถเรียกคืนได้อย่างง่ายดาย
วิธีการแบบมัลติเธรดจะคล้ายกันโดยที่ค่าใช้จ่ายในการสลับบริบทเพิ่มขึ้นตามจำนวนการเชื่อมต่อ แต่อาจมีประสิทธิภาพของหน่วยความจำในบริบทที่ใช้ร่วมกัน ปัญหาเกี่ยวกับวิธีการดังกล่าวเป็นเรื่องยากที่จะจัดการหน่วยความจำที่แชร์ในลักษณะที่ปลอดภัย แนวทางในการแก้ไขปัญหาการซิงโครไนซ์หน่วยความจำมักจะรวมถึงค่าใช้จ่ายของตนเองเช่นการล็อกอาจตรึงเธรดหลักในการโหลดที่ใช้ CPU มากและการใช้ชนิดที่ไม่เปลี่ยนรูปจะเพิ่มการคัดลอกข้อมูลจำนวนมากโดยไม่จำเป็น
AFAIK โดยทั่วไปใช้วิธีการแบบหลายกระบวนการในเซิร์ฟเวอร์ HTTP ที่บล็อกเนื่องจากเป็นวิธีที่ปลอดภัยกว่า / ง่ายกว่าในการจัดการ / กู้คืนหน่วยความจำในลักษณะที่ปลอดภัย การรวบรวมขยะกลายเป็นปัญหาที่ไม่ใช่เมื่อการกู้คืนหน่วยความจำนั้นง่ายพอ ๆ กับการหยุดกระบวนการ สำหรับกระบวนการที่ใช้เวลานาน (เช่น daemon) คุณลักษณะนั้นมีความสำคัญเป็นพิเศษ
ในขณะที่ค่าใช้จ่ายในการสลับบริบทอาจดูเหมือนไม่มีนัยสำคัญกับคนงานจำนวนน้อยข้อเสียมีความเกี่ยวข้องมากขึ้นเมื่อโหลดเพิ่มขึ้นถึงการเชื่อมต่อพร้อมกันนับแสนถึงพัน ที่ดีที่สุดการสลับบริบทจะปรับขนาด O (n) ให้เหลือจำนวนคนทำงาน แต่ในทางปฏิบัติมันจะแย่กว่ามาก
ในกรณีที่เซิร์ฟเวอร์ที่ใช้การบล็อกอาจไม่ใช่ตัวเลือกที่เหมาะสำหรับการใช้งานหนักของ IO พวกเขาเหมาะอย่างยิ่งสำหรับงานที่ใช้ CPU มากและการส่งผ่านข้อความจะถูกเก็บไว้ในระดับต่ำสุด
non-blocking:
การไม่บล็อกจะเป็นสิ่งที่เหมือนกับ Node.js หรือ nginx สิ่งเหล่านี้เป็นที่รู้จักโดยเฉพาะอย่างยิ่งสำหรับการปรับการเชื่อมต่อจำนวนมากขึ้นต่อโหนดภายใต้โหลดที่ใช้ IO มาก โดยทั่วไปแล้วเมื่อมีคนเข้ามาถึงขีด จำกัด สูงสุดของสิ่งที่เซิร์ฟเวอร์ที่ใช้เธรด / กระบวนการสามารถจัดการพวกเขาเริ่มสำรวจตัวเลือกอื่น สิ่งนี้เรียกว่าปัญหา C10K (เช่นความสามารถในการจัดการ 10,000 การเชื่อมต่อพร้อมกัน)
โดยทั่วไปเซิร์ฟเวอร์ async ที่ไม่บล็อกจะแชร์คุณสมบัติมากมายด้วยวิธีการแบบมัลติเธรดพร้อมล็อคซึ่งคุณต้องระวังเพื่อหลีกเลี่ยงการใช้งาน CPU มากเนื่องจากคุณไม่ต้องการโหลดเธรดหลักมากเกินไป ข้อได้เปรียบคือค่าใช้จ่ายที่เกิดขึ้นจากการสลับบริบทจะถูกกำจัดเป็นหลักและการส่งผ่านข้อความบริบทเพียงครั้งเดียวจะกลายเป็นปัญหาที่ไม่ใช่
แม้ว่ามันอาจจะไม่สามารถใช้ได้กับโปรโตคอลเครือข่ายจำนวนมาก แต่ HTTPs ที่ไร้สัญชาตินั้นทำงานได้ดีเป็นพิเศษสำหรับสถาปัตยกรรมที่ไม่มีการบล็อก โดยการใช้การรวมกันของ reverse-proxy และเซิร์ฟเวอร์ HTTP ที่ไม่มีการบล็อกหลายตัวเป็นไปได้ที่จะระบุและกำหนดเส้นทางรอบ ๆ โหนดที่มีโหลดจำนวนมาก
แม้แต่บนเซิร์ฟเวอร์ที่มีเพียงหนึ่งโหนดก็เป็นเรื่องปกติมากสำหรับการตั้งค่าเพื่อรวมเซิร์ฟเวอร์หนึ่งตัวต่อโปรเซสเซอร์หลักเพื่อเพิ่มปริมาณงานสูงสุด
ทั้งสอง:
กรณีการใช้ 'อุดมคติ' จะเป็นการรวมกันของทั้งสองอย่าง พร็อกซีย้อนกลับที่ด้านหน้าอุทิศให้กับคำขอการเราต์ที่ด้านบนจากนั้นเป็นการผสมผสานระหว่างเซิร์ฟเวอร์บล็อกและเซิร์ฟเวอร์ที่ไม่ปิดกั้น การไม่ปิดกั้นสำหรับงาน IO เช่นการให้บริการเนื้อหาแบบคงที่เนื้อหาแคชเนื้อหา HTML การบล็อกสำหรับงานที่มี CPU มากเช่นการเข้ารหัสภาพ / วิดีโอการสตรีมเนื้อหาการบีบอัดตัวเลขการเขียนฐานข้อมูลเป็นต้น
ในกรณีของคุณ:
หากคุณเพียงแค่ตรวจสอบส่วนหัว แต่ไม่ประมวลผลคำขอจริง ๆ แล้วสิ่งที่คุณกำลังอธิบายคือพร็อกซีย้อนกลับ ในกรณีเช่นนี้ฉันจะใช้ async
ผมขอแนะนำให้ตรวจสอบจากเอกสารสำหรับNginx ในตัวพร็อกซี่กลับ
นอกเหนือ:
ฉันอ่านบทความจากลิงค์ที่คุณให้ไว้และมันก็สมเหตุสมผลว่า async เป็นตัวเลือกที่แย่สำหรับการใช้งานเฉพาะของพวกเขา ปัญหานี้สามารถสรุปได้ในคำสั่งเดียว
พบว่าเมื่อสลับระหว่างไคลเอนต์รหัสสำหรับการบันทึกและการคืนค่า / สถานะเป็นเรื่องยาก
พวกเขากำลังสร้างแพลตฟอร์มรัฐ ในกรณีเช่นนี้วิธีการซิงค์จะหมายความว่าคุณจะต้องบันทึก / โหลดสถานะทุกครั้งที่สลับบริบท (เช่นเมื่อเหตุการณ์เกิดไฟไหม้) นอกจากนี้ในด้าน SMTP พวกเขากำลังทำงานอย่างหนักด้วย CPU
ดูเหมือนว่าพวกเขาจะเข้าใจแอสซิงก์ได้ไม่ดีนักและส่งผลให้มีสมมติฐานที่ไม่ดีมากมาย