ทำไมต้อง Node.JS? by

28
Feb
0

ภาษาฝั่ง server ยอดนิยมทุกวันนี้คงหนีไม่พ้น php, python, ruby แต่เหตุใด Node.JS ถึงมาแรงขึ้นเรื่อยๆ และเป็นภาษาที่น่าจับตามองในปีนี้? เหตุผลหลักอยู่ที่นี่แล้ว!

  • เป็นภาษาที่ออกแบบมาเป็น Event-Driven คือทำงานตามเหตุการที่เกิด ซึ่งเรียกอีกอย่างได้ว่ามันทำงานแบบ Asynchronous
  • จริงๆ ภาษาอื่นก็มี Framework ที่ช่วยให้เขียนแบบ Event-Driven เหมือนกันเช่น Photon(PHP), Tornado (Python) แต่สิ่งที่ Node.JS เด่นกว่าชาวบ้านคือมันเกิดมาเพื่อเป็น Asynchronous มาแต่แรก ทำให้ library ต่างๆ กว่า 90% ทำงานแบบ Asynchronous ทั้งหมด หากเป็นภาษาอื่นจะหา library ที่เป็นแบบ Asynchronous ยากกว่ามากเพราะโดยพื้นฐานออกแบบมาให้ทำงานแบบ Synchronous ซึ่งหากเผลอรัน code ที่ทำงานแบบ Synchronous ในระหว่างทำงาน Asynchronous code จะพังได้ ซึ่งคนที่ไม่คุ้นจะเผลอเรียกคำสั่งที่คุ้นเคยได้ง่ายมาก สรุปคือ library ที่เคยใช้เช่น mysql แบบเดิมๆ ก็จะใช้ไม่ได้ ต้องรื้อ code ใหม่หมด ปรับความเคยชินใหม่หมดอยู่ดี มีแค่ syntax ที่ยังเหมือนเดิม แต่การทำงานต่างจากเดิมโดยสิ้นเชิง
  • เนื่องจากการทำงานฝั่ง web server มีการ “รอ” กันมากมาย ดังนั้นเมื่อใช้ Node.JS จะช่วยลดการรอลงได้มาก ตัวอย่างการต่อเช่น รอ mysql ทำงานเสร็จ, รอการเขียนลงไฟล์, รอรับ request มาจากผู้ใช้หลายๆ คน ทุกอย่างสามารถทำไปพร้อมๆ กันได้ทั้งหมด
  • Node.JS เป็นทั้ง Web Server (แทน Apache) เป็นได้ทั้ง Load Balancer (แทน Nginx, Haproxy) และเป็นตัว Application เอง ทำให้สามารถทำงานเสร็จทั้งหมดในตัวมันเอง
  • Node.JS ทำงานแบบ Single thread (เพราะต้องทำหน้าที่ web server) และขณะทำงานจะไม่มีการปิด process ตัวเองทิ้ง process จะรันตลอดเวลาเพื่อรอรับ request จากผู้ใช้เข้ามาอยู่ตลอด หรือพูดง่ายๆ คือ “process เดียวทำทุกอย่าง” (ยกเว้นเขียน cluster ซึ่งถ้าโหลดไม่มากจริงๆ ก็ไม่ต้องใช้) ทำให้เหมาะแก่การทำเป็น background process คอยทำงานบางอย่างตลอดเวลามากกว่า php ที่ process เกิดแล้วตายเรื่อยๆ ตลอด
  • เนื่องจากมันมี process เดียว ทำให้เราสามารถตั้งตัวแปร global ขึ้นมาตัวนึงแล้วสามารถใช้ร่วมกันระหว่าง user ทุกคนได้โดยไม่ต้องสร้างใหม่ตลอดเวลา เช่นการทำ cache อะไรบางอย่างที่ปกติต้องเก็บใน memcache พอจะใช้งานก็ดึงออกมา unserialize ทุกๆ ครั้ง ทำให้เสีย cpu ไปไม่ใช่น้อย ถ้าใช้ node.js คุณอาจไม่ต้องใช้ memcache เลย เมื่อดึงข้อมูลจาก database มาครั้งแรกครั้งเดียวก็สามารถเก็บลงตัวแปรไว้ reuse ได้ตลอดเวลา ไม่ต้องไปพักค่าที่ memcache และดึงมา unserialize ทุกครั้งอีกต่อไป
  • จากข้อที่แล้ว เลยทำให้มีทรัพยากรที่ใช้ร่วมกัน ลด Memory ที่ต้องใช้ลงได้มาก

ตัวอย่าง pseudo code แบบ synchronous:


a = mysql_query("SELECT * FROM user WHERE id = 1");
b = mysql_query("SELECT * FROM item");
show_user(a);
show_item(b);

จาก code ด้านบน สมมติบรรทัดแรกใช้เวลาทำงาน 10 วิถึงจะได้ค่าลงตัวแปร a และอีก 3 วิจะได้ค่าลงตัวแปร b รวมเป็น 13 วิ จึงจะแสดงผล item ได้ทั้งๆ ที่ item ใช้เวลาดึง query มาน้อยกว่า

ตัวอย่าง pseudo code แบบ asynchronous:

mysql_query("SELECT * FROM user WHERE id = 1", function(error, result){
show_user(a);
});
mysql_query("SELECT * FROM item", function(error, result){
show_item(result);
});

จากตัวอย่างข้างบนแม้การดึงข้อมูล user จะกินไป 10 วิ แต่เนื่องจากไม่ต้องรอให้ดึง user เสร็จก่อนก็สามารถดึงข้อมูล item ต่อได้เลย ทำให้สามารถ show_item ได้โดยใช้เวลา 3 วิ และ user ก็จะแสดงผลทีหลัง ทำให้การทำงานโดยรวมเร็วขึ้น วันนี้เอาเท่านี้ก่อนละกันครับ :)

Enjoy this article?

Consider subscribing to our RSS feed!

ไม่มีความเห็น

ยังไม่มีความเห็น

ใส่ความเห็น

RSS feed for comments on this post