Node.js ควรเป็นหนึ่งในเทคโนโลยีที่ร้อนแรงที่สุดในปัจจุบัน บทความนี้ส่วนใหญ่แนะนำลักษณะและสถานการณ์แอปพลิเคชันของ Node.js.
Node.js เป็นแพลตฟอร์มที่สร้างขึ้นบนรันไทม์ Chrome JavaScript ซึ่งใช้ในการสร้างแอปพลิเคชันเครือข่ายที่รวดเร็วและง่ายต่อการปรับขนาด Node.js มีน้ำหนักเบาและมีประสิทธิภาพด้วยการขับเคลื่อนเหตุการณ์และเหมาะสำหรับแอปพลิเคชันแบบเรียลไทม์ที่ใช้ข้อมูลที่ใช้ข้อมูลบนอุปกรณ์กระจาย
1. คุณสมบัติ
1.1 I/O แบบอะซิงโครนัส
I/O ที่เรียกว่าอะซิงโครนัสนั้นสัมพันธ์กับ I/O แบบซิงโครนัส การดำเนินการ I/O จำนวนมากจะต้องดำเนินการในระหว่างการดำเนินการของโปรแกรมเช่นการอ่านและการเขียนไฟล์อินพุตและเอาต์พุตการตอบสนองการร้องขอ ฯลฯ โดยทั่วไปการพูดการดำเนินการ I/O ใช้เวลานาน ตัวอย่างเช่นในโหมดการเขียนโปรแกรมแบบดั้งเดิมคุณต้องอ่านไฟล์ของ G หลาย ๆ G เธรดทั้งหมดจะหยุดชั่วคราวและรอให้ไฟล์อ่านและดำเนินการต่อ กล่าวอีกนัยหนึ่งการดำเนินการ I/O บล็อกการดำเนินการของรหัสลดประสิทธิภาพของโปรแกรมอย่างมาก
เกี่ยวกับ I/O แบบอะซิงโครนัสจริง ๆ แล้วมันไม่คุ้นเคยกับวิศวกรส่วนหน้าเพราะการเริ่มต้นคำขอ AJAX เป็นสาย "อะซิงโครนัส" ที่พบบ่อยที่สุด ในโหนดการอ่านไฟล์ (การอ่านไฟล์เป็นการดำเนินการ I/O ที่ใช้เวลานาน) เป็นตัวอย่างมันคล้ายกับวิธีการเริ่มต้นคำขอ AJAX:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
fs.readfile ('/path', ฟังก์ชัน (err, ไฟล์) {
console.log ('อ่านไฟล์เสร็จแล้ว');
-
console.log ('เริ่มอ่านไฟล์');
หลังจากรหัสด้านบนเรียกว่า fs.readfile รหัสที่ตามมาจะถูกเรียกใช้งานทันทีและเวลาที่ "อ่านไฟล์เสร็จสิ้น" ไม่สามารถคาดการณ์ได้ เมื่อเธรดพบการดำเนินการ I/O มันจะไม่รอให้การดำเนินการ I/O สิ้นสุดในลักษณะการปิดกั้น แต่จะส่งคำขอ I/O ไปยังระบบปฏิบัติการและดำเนินการต่อเพื่อดำเนินการต่อไป เมื่อระบบปฏิบัติการเสร็จสิ้นการดำเนินการ I/O เธรดที่ดำเนินการ I/O จะได้รับแจ้งในรูปแบบของเหตุการณ์และเธรดจะประมวลผลเหตุการณ์ในเวลาที่กำหนด
1.2 ฟังก์ชั่นลูปเหตุการณ์และการโทรกลับ
ลูปเหตุการณ์ที่เรียกว่าหมายความว่าโหนดจะใช้กลไกเหตุการณ์เพื่อแก้ปัญหาการทำงานแบบอะซิงโครนัสทั้งหมดและเธรดจะวนรอบอย่างต่อเนื่องเพื่อตรวจจับคิวเหตุการณ์ Event Loop ตรวจสอบเหตุการณ์ที่ไม่หยุดยั้งในคิวเหตุการณ์จนถึงสิ้นสุดโปรแกรม วิธีการเขียนโปรแกรมของเหตุการณ์มีข้อดีของการมีเพศสัมพันธ์ที่มีน้ำหนักเบา, การมีเพศสัมพันธ์แบบหลวมและมุ่งเน้นเฉพาะจุดธุรกรรมเท่านั้น อย่างไรก็ตามในสถานการณ์ของงานอะซิงโครนัสหลายครั้งเหตุการณ์ต่าง ๆ เป็นอิสระจากกันและวิธีการให้ความร่วมมือเป็นปัญหา ใน JavaScript ฟังก์ชั่นการโทรกลับมีอยู่ทุกหนทุกแห่งและฟังก์ชั่นการโทรกลับเป็นวิธีที่ดีที่สุดในการรับสายแบบอะซิงโครนัสเพื่อส่งคืนข้อมูล
1.3 เกลียวเดี่ยว
โหนดรักษาลักษณะของ JS เป็นเธรดเดียวในเบราว์เซอร์ ข้อได้เปรียบที่ใหญ่ที่สุดของเธรดเดี่ยวคือไม่จำเป็นต้องมีปัญหาการซิงโครไนซ์ที่ใส่ใจรัฐเช่นการเขียนโปรแกรมแบบมัลติเธรดไม่มีการหยุดชะงักหรือค่าใช้จ่ายของการสลับบริบทของเธรด เธรดเดี่ยวยังมีจุดอ่อนส่วนใหญ่ปรากฏในสามด้าน: การไม่สามารถใช้ CPU แบบหลายคอร์; ข้อผิดพลาดจะทำให้แอปพลิเคชันทั้งหมดออกไปและความทนทานของแอปพลิเคชันนั้นคุ้มค่ากับการสอบเข้าบัณฑิตศึกษา การคำนวณจำนวนมากจะครอบครอง CPU และทำให้เป็นไปไม่ได้ที่จะโทรหา I/O แบบอะซิงโครนัสต่อไป
เพื่อแก้ปัญหาข้างต้นโหนดใช้ความคิดเช่นเดียวกับผู้ทำงานบนเว็บ HTML5 และใช้ child_process เพื่อแก้ปัญหาการคำนวณจำนวนมากในเธรดเดียว โดยการกระจายการคำนวณไปยังกระบวนการเด็กแต่ละครั้งการคำนวณจำนวนมากสามารถลดลงและผลลัพธ์สามารถส่งผ่านข้อความเหตุการณ์ระหว่างกระบวนการ
1.4 ข้ามแพลตฟอร์ม
โหนดเป็นข้ามแพลตฟอร์มนั่นคือชุดรหัส JS ชุดเดียวกันสามารถปรับใช้และทำงานบน Windows, Linux, OSX และแพลตฟอร์มอื่น ๆ นี่เป็นส่วนใหญ่เนื่องจากความจริงที่ว่าโหนดได้สร้างสถาปัตยกรรมระดับแพลตฟอร์ม libuv ระหว่างระบบปฏิบัติการและระบบโมดูลระดับบนโหนด
2. สถานการณ์แอปพลิเคชัน
1) แอปพลิเคชันแบบเรียลไทม์: เช่นการแชทออนไลน์การส่งการแจ้งเตือนแบบเรียลไทม์ ฯลฯ (เช่น socket.io)
2) แอปพลิเคชันแบบกระจาย: ใช้ข้อมูลที่มีอยู่ผ่าน I/O คู่ขนานที่มีประสิทธิภาพ
3) แอปพลิเคชันเครื่องมือ: เครื่องมือขนาดใหญ่จากการปรับใช้การบีบอัด front-end (เช่นคำราม) ไปจนถึงแอปพลิเคชันกราฟิกเดสก์ท็อป
4) แอพพลิเคชั่นเกม: สนามเกมมีข้อกำหนดสูงสำหรับเวลาจริงและพร้อมกัน (เช่น Framework Pomelo ของ NetEase)
5) ใช้อินเทอร์เฟซที่เสถียรเพื่อปรับปรุงความสามารถในการแสดงผลทางเว็บ
6) สภาพแวดล้อมการเขียนโปรแกรมส่วนหน้าแบบครบวงจร: นักพัฒนาส่วนหน้าสามารถเข้าสู่การพัฒนาฝั่งเซิร์ฟเวอร์ได้อย่างรวดเร็ว (เช่นสถาปัตยกรรม Pure JavaScript Pure Pure ที่มีชื่อเสียง) สถาปัตยกรรม)