The Core Concept of Node.js

Node.js from the Zero ... Event สนุกๆ ที่จัดขึ้นโดยพี่แอมป์แห่ง Proteus Technology ... ตอนแรกผมนี่แหละ ที่มีหน้าที่ต้องไปสอน เนื่องจากพี่แอมป์เห็นว่า ผมกำลังทำงานโดยใช้ Node.js อยู่ และอยู่ๆ ก็เกิดเหตุการณ์ไม่คาดฝันขึ้น ไม่นึกเลยว่าเทพ Node.js จะอยู่ไกล้ตัวเรานี่แหละ ... พี่บอล (@b_architect) มาร่วมแจม แล้วก็กลายเป็นอาจารย์หลักของ Event ส่วนเราเป็น TA ที่เขียนโปรแกรม Chat โดยใช้ Node.js (socket.io) ไป Demo :)

        Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
จากข้อความข้างต้นจะเห็นได้ว่า Core Concept ของ Node.js ที่เราได้จากข้อความนี้ก็คือ "Event-driven" หรือ "Event Base Programming" และ "non-blocking I/O model" 

ว่าด้วยเรื่องงานที่เหมาะสมก่อน ... "Perfect for data-intensive real-time applications that run across distributed devices" ... นึกภาพง่ายๆ นะครับ งานที่ต้องต่อกับ Server ตลอดเวลา และรอที่จะ Trigger Event อะไรบางอย่าง เช่นโปรแกรม Chat, Instant Messenger หรือการทำ Streaming ต่างๆ เป็นต้น

non-blocking I/O model หรือที่หลายๆ คนเรียกว่า Asynchronus นั่นแหละครับ มาดู Code ชุดนี้ในรูปแบบของ Node.js กันหน่อยดีกว่า ก่อนที่จะอธิบายต่อ

Blocking Code

non-Blocking Code
สิ่งที่ต่างกันก็คือ Code ชุดแรกนั้นจะทำการอ่านไฟล์จนเสร็จเรียบร้อยก่อน แล้วค่อยแสดงเนื้อหาใน File จากนั้นพิมพ์ข้อความ Hello, world ออกทาง Console

ส่วน Code ชุดที่สอง จะอ่านไฟล์แต่ไม่ได้สนใจว่าจะเสร็จแล้วหรือไม่ จากนั้นพิมพ์ข้อความ Hello, world ทันที แล้วเมื่ออ่านไฟล์เรียบร้อยแล้ว ก็จะแสดงผลเนื้อหาของไฟล์ตาม Callback Function ที่เราได้ Implement ไว้

ลักษณะที่เกิดขึ้นจะเห็นว่าไม่เกิดคอขวดที่ฝั่ง Server เมื่อเรา Request อะไรสักอย่างที่ต้องรอ ก็จะไม่ต้องรอ และประมวลผลคำสั่งต่อๆ ไปได้เลย ซึ่งดีมาก แต่ลักษณะที่เกิดขึ้นนั้น หลายคนก็เริ่มเข้าใจผิดว่า Node.js นั้นทำงานแบบ Multi-Thread ... เนื่องจากใน Sense ของ Programmer ทั่วไปนั้น จะมอง non-Blocking Code ที่ผมแสดงด้านบนว่า
เมื่อ readFile Function ถูกเรียก ระบบจะสร้าง Thread ขึ้นมาเพื่ออ่านไฟล์นั้น แล้วปล่อยให้ Main Thread ทำงานต่อไป จนเมื่อ Thread นั้นๆ ทำการอ่านไฟล์เสร็จแล้ว จึงส่งข้อมูลกลับมาเพื่อแสดงผล
จากตัวอย่างที่แสดง นั่นคือในกรณีของ Application Server ทั่วไป ที่จะสร้าง Thread ขึ้นมาจัดการ Request ต่างๆ ที่เข้ามาให้เรา เวลาที่ Request ไหนเกิด Exception ก็จะทำให้แค่ Request นั้นๆ พังไป
แต่ในความเป็นจริง Node.js นั้นทำงานแบบ Single Thread (พี่บอลบอกว่าภาษา Javascript ถูกสร้างมาเพื่อทำงานแบบ Single Thread อยู่แล้ว) แต่สิ่งที่ทำให้ Node.js ทำงานแบบ non-Blocking I/O ได้นั้น Node.js ใช้สิ่งที่เรียกว่า Events Looper เข้ามาช่วย

โดย Events Looper ก็จะมีสิ่งที่เรียกว่า Event Queue (อยากให้นึกภาพท่ออะไรสักอย่าง) ที่จะมีของใส่ลงไปเรื่อยๆ เวลาเกิด Event แล้ว Node.js ก็จะทำงานในท่อนั้นทีละชิ้น ตามลำดับที่เข้าไป เมื่องานไหนเสร็จก็จะทำงานใน Callback ของแต่ละ Event ที่เขียนไว้ ด้วยหลักการนี้เอง จึงทำให้ Node.js ทำงานในรูปแบบของ non-Blocking I/O ได้ แม้จะเป็น Single Thread Application

จากที่ได้กล่าวมานั่นคือ Node.js ทำงานเป็น non-Blocking I/O และเป็น Single Thread ความอันตรายที่จะเกิดขึ้นคือ ถ้า Code เราเขียนแบบไม่รอบคอบ เกิด Exception ขึ้นในการทำงานของโปรแกรมโดยที่เราไม่ได้เขียน Exception Handler เอาไว้ ก็จะทำให้ Server Down ในทันที

ดังนั้น ของดีแค่ไหน ก็เป็นดาบสองคมนะ :) ใช้อย่างเข้าใจก็จะดีที่สุด

Popular posts from this blog

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

5 TED Talk ที่จะช่วยให้คุณทำงานดีขึ้น