บทความนี้จะรวมเรื่องพื้นฐานเกี่ยวกับ Nodejs โดยรวมเก็บไว้สำหรับผมก็จะแจกไปด้วยนะครับ
พื้นฐาน nodejs
ผมคงไม่ต้องบอกว่าข้อดีทั่วๆไปว่า nodejs มันดียังไง แต่หลายๆอย่างที่ผมไม่ได้เข้าใจมันอย่างเรื่องหลักการทำงานของมันทำให้เราอาจจะงงเวลาเขียนหรือผิดพลาดบางเรื่องจนเป็นปัญหาภายหลังได้
- Nodejs เป็น Single Threaded Event Loop Model จัดการพวก client ที่เข้ามาเชื่อมต่อ
- แต่ความจริงมันจริงแค่ครึ่งเดียวของการเป็น single thread เพราะความจริงคือ Single thread ที่ทำงานร่วมกับ Background worker
- Event loop ที่คอยรับคำสั่งจากภาษาอ่ะ มันวิ่งแค่ single และเอางานไปแจกให้พวก thread ที่แยกทางข้างหลัง
เรื่อง thread ใครไม่เข้าใจเชิญทางนี้ได้เลยครับ https://www.extremepc.in.th/cpu-core-vs-thread/
เกิดอะไรขึ้นใน Single thread event loop มาดู code ตัวอย่างกันหน่อยครับ
var sockets = require('websocket.io'),httpServer = sockets.listen(4000); httpServer.on('onConnection', function (socket) { console.log('connected……'); httpServer.send('Web socket connected.'); httpServer.on('message', function (data) { console.log('message received:', data); }); httpServer.on('close', function () { console.log('socket closed!'); }); });
เมื่อรันคำสั่ง sockets.listen(4000) Web-Socket server จะถูกสร้างใน Single thread และ Event loop จะคอยดักอยู่ที่ port 4000 คราวนี้ถ้ามี client เข้ามาเชื่อมต่อ ตัว Event “onConnection” จะถูกเรียกให้ทำงาน มันจะทำการเอาคำสั่ง นี้ไปปล่อยใน thread pool ให้นึกถึงห้องที่มีกลุ่มคนงานที่พร้อมจะมารับงานไปทำต่อโดยใครวางก็มาต่อแถวรอกันในห้อง
สิ่งนี้เป็นสิ่งที่แตกต่างกับพวก apache หรือตัวเว็บ server อื่นๆ โดยถ้าหากมีคนมาเชื่อมต่อคนที่ 2,3,4,… ตัว Nodejs จะไม่สร้าง thread ใหม่มาแต่จะทำการให้ Event loop มาจับคำสั่งการเชื่อมต่อแต่ละ client และโยนงานต่อให้พวก worker ไปทำงานต่อ
ถ้ามองเหมือนเรื่องทั่วๆไปก็คือตัว Event loop เหมือนพนักงานต้อนรับ เราไปติดต่อเสร็จเราก็จะพาเราไปส่งในห้องและให้คนในห้องจัดการต่อ และ พนักงานต้อนรับก็ไปรับคนอื่นต่อได้เลยปล่อยให้คนในห้องจัดการกับเรื่องเราต่อนั่นเอง
โดย Libuv library จะทำงานร่วมกับ OS kernel การทำงานอย่างนี้ทำให้มันสามารถรองรับการทำงานเยอะๆได้ เพราะว่าพวก OS kernel ปัจจุบันก็ทำงานแบบ multi thread ได้ หลังจากทำงานครบหมดทุก thread ที่กระจายของ process นั้นๆแล้วมันจะบอก Nodejs ให้ทำการหยิบงานใหม่เข้า thread pool อีก
เรื่องพื้นฐานตั้งแต่ JS -> Nodejs เชิญด้านนี้ได้เลยครับ
ข้างล่างเป็น concept ของ event loop เวลาที่ nodejs มันทำงานมันทำงานอย่างไร
Callback / Promise / Async – Await
แนะนำให้อ่าน blog ของน้องปันเจเลยอธิบายได้ดี