IOloop 'หนึ่ง' สามารถจัดการการเชื่อมต่อ 10,000 ครั้งได้อย่างไร

ฉันขอโทษสำหรับคำถามโง่ๆ นี้ แต่ฉันสับสนจริงๆ และฉันหวังว่าคุณจะแก้ไขฉันว่าฉันผิดตรงไหน

ในเซิร์ฟเวอร์ แบบเธรด (เช่น Apache) ฉันเข้าใจว่าสำหรับลูกค้าแต่ละราย จะมีการสร้าง 'ผู้ปฏิบัติงาน' ใหม่เพื่อให้เขาตอบสนองทุกความต้องการของเขา

ในเหตุการณ์ที่ขับเคลื่อน (เช่น Nginx และ Tornado) สิ่งนี้ทำให้ฉันสับสน โดยเฉพาะอย่างยิ่งที่มี ไม่ปลอดภัยสำหรับเธรด เช่น Python's GIL; จากสิ่งที่ฉันเข้าใจ มีหนึ่งวงเดียวที่จะจัดการคำขอของลูกค้าทั้งหมด ดังนั้นตามความเข้าใจของฉัน หากมีการเชื่อมต่อพร้อมกัน 10,000 รายการ ฉันไม่เห็นว่าจะตอบสนองคำขอทั้ง 10 รายการเหล่านั้นได้อย่างไร!


person Abdelouahab Pp    schedule 02.12.2012    source แหล่งที่มา


คำตอบ (1)


ในเซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์ คุณเพียงจัดการการเชื่อมต่อ (read()s และ write()s จากการเชื่อมต่อเฉพาะ) ทีละรายการ โดยใช้การโทรที่ไม่บล็อก โดยปกติคุณจะใช้การโทรเพื่อมัลติเพล็กซ์ระหว่างการเชื่อมต่อ (select(), poll(), ...) ซึ่งจะบอกคุณว่าการเชื่อมต่อใดจำเป็นต้องได้รับบริการ และคุณก็ให้บริการการเชื่อมต่อเหล่านั้นตามลำดับ

person ninjalj    schedule 02.12.2012
comment
แล้วทำไมเราไม่สามารถรวมระหว่างเซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์และเซิร์ฟเวอร์แบบเธรดได้ - person Abdelouahab Pp; 02.12.2012
comment
คุณสามารถ. เช่น คุณอาจมีเธรดต่อ CPU-core โดยที่แต่ละเธรดขับเคลื่อนด้วยเหตุการณ์ คุณอาจมีเธรดผู้ปฏิบัติงานเพื่อจัดการกับการสร้างเพจแบบไดนามิก (PHP, JSP, ...) และให้บริการเนื้อหาคงที่ (รูปภาพ, ...) ผ่านเธรดที่ขับเคลื่อนด้วยเหตุการณ์ปกติ - person ninjalj; 02.12.2012
comment
ปัญหาคือ Python (CPytohn) มี GIL และอย่างที่บอกว่า Tornado จัดการการเชื่อมต่อ 10k ดังนั้นฉันจึง 'ตกใจ' ที่สามารถเกิดขึ้นได้! หากการเชื่อมต่อพร้อมกัน 10k เกิดขึ้น ดังนั้นหากการดำเนินการมีเวลา 1 วินาที il จะถูกแบ่งออกเป็น 1/10k ? - person Abdelouahab Pp; 02.12.2012
comment
มันขึ้นอยู่กับ. ทอร์นาโดอาจสามารถรองรับการเชื่อมต่อทั่วไปที่ 10,000/วินาที แต่ข้อจำกัดทางกายภาพยังคงมีอยู่: หากคุณไม่มีแบนด์วิธ คุณจะไม่สามารถจัดการการเชื่อมต่อ 10,000 ที่ขอดาวน์โหลดไฟล์ขนาดใหญ่ได้ ในกรณีนั้น เมื่อให้บริการแต่ละการเชื่อมต่อ วิธีที่ดีที่สุดคือให้เซิร์ฟเวอร์ของคุณส่งเฉพาะ (ระวัง: สูตรที่สร้างขึ้นทันที) (bandwith*desired max latency/active comparison) ซ้ำแต่ละครั้ง - person ninjalj; 02.12.2012
comment
ขออภัย แบนด์วิดท์ที่คุณหมายถึงคืออะไร ถ้าฉันใช้ ADSL ขนาด 2Mb (แอลจีเรียดีที่สุดที่ฉันสามารถทำได้) นี่คือค่านี้ใช่ไหม - person Abdelouahab Pp; 02.12.2012
comment
ในกรณีนั้น มันจะเป็นแบนด์วิดท์ขาออกของคุณ ซึ่งอาจต่ำกว่านั้นมาก เซิร์ฟเวอร์ไม่ว่างควรมีแบนด์วิธมากกว่านี้มาก - person ninjalj; 02.12.2012
comment
ดังนั้นในกรณีของฉัน ฉันควรคิดถึงปัญหา 1k แทนที่จะเป็น 10k :p - person Abdelouahab Pp; 02.12.2012
comment
สำหรับคำถามสุดท้าย: หากเหตุการณ์ขับเคลื่อนเพียงอ่านและเขียนการเชื่อมต่อเฉพาะบางอย่าง แล้วเธรดที่ใช้ทำอะไร - person Abdelouahab Pp; 02.12.2012