กลไกแบบอะซิงโครนัสของโหนดจะขึ้นอยู่กับ "เหตุการณ์" I/O การสื่อสารเครือข่าย และการสืบค้นฐานข้อมูลทั้งหมดจะดำเนินการในลักษณะที่ไม่มีการบล็อก และผลลัพธ์ที่ส่งคืนจะถูกประมวลผลโดยลูปเหตุการณ์ โหนดจะประมวลผลเพียงเหตุการณ์เดียวในเวลาเดียวกัน และเข้าสู่ลูปเหตุการณ์ทันทีเพื่อตรวจสอบเหตุการณ์ที่ตามมาหลังจากเสร็จสิ้น ด้วยวิธีนี้ CPU และหน่วยความจำสามารถมุ่งเน้นไปที่การประมวลผลสิ่งหนึ่งๆ ในเวลาเดียวกัน ในขณะที่พยายามให้ I/O และการดำเนินการอื่นๆ ที่ใช้เวลานานสามารถดำเนินการแบบคู่ขนานได้
สภาพแวดล้อมการทำงานของบทช่วยสอนนี้: ระบบ Windows 7, nodejs เวอร์ชัน 16, คอมพิวเตอร์ DELL G3
NodeJS เป็นแบบเธรดเดียว มีข้อดีดังต่อไปนี้:
เรียบง่ายและ
มีประสิทธิภาพสูง หลีกเลี่ยงการโอเวอร์เฮดการสลับเธรดบ่อยครั้งและ
การใช้ทรัพยากรขนาดเล็ก เนื่องจากเป็นแบบเธรดเดียว การใช้หน่วยความจำจึงยังต่ำมากภายใต้เงื่อนไขการโหลดจำนวน
มาก -ปลอดภัย ไม่มีการล็อค วิธีแก้ปัญหาการทำงานพร้อมกันสูง เช่น การปลดล็อคและการหยุดชะงัก
?
โหนดใช้ IO แบบอะซิงโครนัสและขับเคลื่อนด้วยเหตุการณ์ (ฟังก์ชันเรียกกลับ) เพื่อแก้ปัญหาการทำงานพร้อมกันในระดับสูง
โดยทั่วไปแล้ว โซลูชันที่ทำงานพร้อมกันสูงจะมีโมเดลแบบมัลติเธรด ซึ่งจัดเตรียมเธรดสำหรับตรรกะทางธุรกิจแต่ละอย่าง และชดเชยเวลาโอเวอร์เฮดของการเรียก I/O แบบซิงโครนัสผ่านการสลับเธรดของระบบ เช่นเดียวกับ Apache มีหนึ่งเธรดต่อคำขอ
NodeJS ใช้โมเดลแบบเธรดเดียวและใช้วิธีการร้องขอแบบอะซิงโครนัสสำหรับ I/O ทั้งหมดเพื่อหลีกเลี่ยงการสลับบริบทบ่อยครั้ง โดยจะรักษาคิวเหตุการณ์ไว้เมื่อมีการดำเนินการ NodeJS โปรแกรมจะเข้าสู่ลูปเหตุการณ์เมื่อดำเนินการและรอให้เหตุการณ์ถัดไปมาถึง แต่ละคำขอ I/O แบบอะซิงโครนัสจะถูกส่งไปยังคิวเหตุการณ์เพื่อดำเนินการหลังจากเสร็จสิ้น
กลไกอะซิงโครนัสของ NodeJS เป็นไปตามเหตุการณ์ I/O การสื่อสารเครือข่าย และการสืบค้นฐานข้อมูลทั้งหมดจะดำเนินการในลักษณะที่ไม่บล็อก และผลลัพธ์ที่ส่งคืนจะถูกประมวลผลโดยลูปเหตุการณ์ ดังแสดงในภาพ:
กระบวนการ Node.js จะประมวลผลเพียงเหตุการณ์เดียวในแต่ละครั้ง หลังจากเสร็จสิ้น กระบวนการจะเข้าสู่ลูปเหตุการณ์ทันทีเพื่อตรวจสอบเหตุการณ์ที่ตามมา ข้อดีของการทำเช่นนี้ก็คือ CPU และหน่วยความจำสามารถมุ่งเน้นไปที่การประมวลผลสิ่งหนึ่งสิ่งใดในเวลาเดียวกัน ในขณะที่พยายามให้ I/O และการดำเนินการอื่นๆ ที่ใช้เวลานานสามารถดำเนินการแบบขนานได้ สำหรับการโจมตีการเชื่อมต่อความเร็วต่ำ Node.js จะเพิ่มคำขอลงในคิวเหตุการณ์เท่านั้นและรอการตอบสนองของระบบปฏิบัติการ ดังนั้นจึงไม่มีค่าใช้จ่ายแบบมัลติเธรด ซึ่งสามารถปรับปรุงความแข็งแกร่งของเว็บแอปพลิเคชันได้อย่างมากและป้องกันการโจมตีที่เป็นอันตราย
กลไกการวนซ้ำของเหตุการณ์
สิ่งที่เรียกว่าการวนซ้ำของเหตุการณ์หมายความว่า NodeJS จะใช้กลไกเหตุการณ์เพื่อแก้ไขการดำเนินการแบบอะซิงโครนัสทั้งหมด มีเธรดที่วนซ้ำอย่างต่อเนื่องเพื่อตรวจจับคิวเหตุการณ์
ตรรกะทั้งหมดใน NodeJS คือฟังก์ชันการเรียกกลับเหตุการณ์ ดังนั้น NodeJS จึงอยู่ในลูปเหตุการณ์เสมอ และรายการโปรแกรมจะเป็นฟังก์ชันการเรียกกลับของเหตุการณ์แรกในลูปเหตุการณ์ ฟังก์ชันการเรียกกลับเหตุการณ์อาจออกคำขอ I/O หรือปล่อยเหตุการณ์โดยตรง และกลับสู่ลูปเหตุการณ์หลังจากดำเนินการ ลูปเหตุการณ์จะตรวจสอบคิวเหตุการณ์เพื่อหาเหตุการณ์ที่ไม่ได้จัดการจนกว่าโปรแกรมจะสิ้นสุด นักพัฒนาจะมองไม่เห็น Event Loop ของ NodeJS และไลบรารี libev จะตรวจสอบอย่างต่อเนื่องว่ามี Listener เหตุการณ์ที่ใช้งานอยู่ซึ่งสามารถตรวจพบได้หรือไม่ และจะไม่ออกจาก Event Loop จนกว่าจะตรวจไม่พบ Listener เหตุการณ์ และโปรแกรมจะสิ้นสุด