ใครที่ใช้ Node.js ในการทำ real-time application น่าจะรู้จัก WebSocket และ Socket.io กันเป็นอย่างดี ตอนนี้ Socket.io เดินทางมาถึง version 1 แล้ว (ล่าสุดที่ผมเขียนโพสต์นี้คือ 1.5.0) ซึ่งก็มีหลายอย่างเปลี่ยนไปจากรุ่น 0.9 ค่อนข้างมาก หลายโปรเจกต์ที่ผมเคยเขียนไว้ด้วย version 0.9 ตอนนี้ก็ outdated ไปแล้วไม่สามารถใช้งาน version 1 ได้ แต่ก็มีบางงานที่ใช้ version 1 แล้ว พบประเด็นที่น่าสนใจเลยอยากบันทึกไว้สักหน่อย
Tag: socket.io
ผมอยากมีหนังสือ NodeJS Tutorial ของตัวเองสักเล่ม จะเป็นไปได้ไหมนะ

ทำไมผมถึงอยากเขียนหนังสือ NodeJS Tutorial
ความคิดนี้ไม่ใช่เพิ่งเกิดครับ ผมคิดถึงมันอยู่เสมอ เคยบล็อกถึงในบล็อกเก่าเมื่อหลายปีมาแล้วด้วย (ตอนนี้บล็อกนั้นหายไปแล้ว)
บล็อกก่อนผมเขียนถึงมุมหนังสือ 3 มุมของผม ซึ่งก็อย่างที่บอกไปครับว่าประเภทของหนังสือและแนวหนังสือที่ผมอ่านมันขึ้นอยู่กับวัย ซึ่งช่วงที่ผมใช้เวลากับมันมากที่สุดและพอที่จะถ่ายทอดออกมาได้ก็คือช่วงที่ผมขลุกอยู่กับหนังสือคอมพิวเตอร์ IT และโปรแกรมมิ่ง
ผมเดินสังเกตตามชั้นหนังสือคอมพิวเตอร์ตามร้านหนังสือต่างๆ มาหลายที่ หลายปี แล้วก็พบว่าหนังสือเกี่ยวกับคอมพิวเตอร์ไม่ค่อยหลากหลาย ที่เพิ่มขึ้นมาเยอะในช่วงหลังคือหนังสือเกี่ยวกับ Social Network และ Mobile app แต่ทางด้านโปรแกรมมิ่งแล้วความหลากหลายแทบไม่มีเลยเคยเป็นมายังไงก็เป็นอยู่อย่างนั้น ภาษาโปรแกรมมิ่งที่เห็นหนังสือมากหน่อยคือด้านเว็บอย่าง PHP และภาษาที่มีการเรียนการสอนในห้องเรียนอย่าง C/C++, Java ภาษาใหม่ (ใหม่สำหรับเมืองไทย) เช่น Python และ Ruby ก็เคยเห็น แต่ออกมาแค่เพียงเล่มเดียวก็หายไปซะแล้ว
Node.js tips: Socket.io การใช้งาน emit และ broadcast
Disclaimer: เนื่องจากโพสต์นี้เขียนไว้ตั้งแต่ Socket.io 0.x ปัจจุบัน Socket.io พัฒนาไปหลาย version แล้ว ตัวอย่างบางส่วนในโพสต์นี้อาจจะใช้ไม่ได้แล้วครับ
การส่งข้อมูลระหว่าง client และ server ของ Socket.io ใช้ method emit() ซึ่งก็มีการใช้งานหลายแบบตามแต่access control ของแต่ละ app ผมขอสรุปตามรูปแบบที่ผมใช้งานบ่อยๆ ดังนี้ครับ
สมมุติว่าผม require module socket.io เข้ามาแบบนี้
var io = require('socket.io');
Source code ของ Twitter Thai Stream บน GitHub
บล็อกก่อนๆ ผมเอา app ที่เขียนด้วย Node.js และ Socket.io deploy ขึ้น OpenShift ซึ่งก็คือ http://thstream-khasathan.rhcloud.com ตอนนี้ผมอัปโหลดโค้ดขึ้นไปบน GitHub ละเผื่อใครที่กำลังศึกษา Node.js เอาไปลองศึกษาดู คลิกตามไปโลด Happy coding ครับ 🙂
ต้องทำอะไรบ้างเมื่อเอา Node.js, Socket.io app ขึ้น production
1. Configuration file
ไฟล์ config เกี่ยวกับการ database, config ทั่วไปของ app เช่นให้รันไว้ที่ port เท่าไหร่, domain อะไร ก่อนรัน app แก้ไขให้ตรงกับที่ใช้จริงก่อนรัน app
อาจจะสงสัยว่า เออ มันเป็นสิ่งที่ต้องทำอยู่แล้วนี่หว่าจะบอกทำไม ใช่ครับมันเป็นเรื่องพื้นฐานที่ต้องทำอยู่แล้วแต่เวลาเบลอๆ (หรือไม่เบลอก็เถอะ) ก็หลงลืมได้ ฉะนั้นถ้าจะเอา app ขึ้น production แก้ config พวกนี้ให้ถูกก่อนถ้ามีปัญหาจะได้ตามแก้เป็น step ไป
Config HAProxy เพื่อใช้งาน Nodejs, Socket.io ร่วมกับ Apache web server
โพสต์ก่อนๆ ผมเขียนถึงการพัฒนา application ด้วย Nodejs และ Socket.io และจำเป็นต้องใช้ร่วมกันกับ PHP ที่รันบน Apache ปัญหาที่พบก็ตามข้อ 3 ในโพสต์เก่านั่นแหละครับคือทำ ProxyPass จาก port 80 ของ Apache ไปที่ app ที่รันไว้ port อื่นไม่ได้เพราะ Apache ไม่รองรับ Websockets
1.Infrastructure
เนื่องจาก Websockets ยังเป็นเรื่องใหม่อยู่ web server ส่วนมากยังไม่รองรับ ลองเสิร์ชหาวิธีแก้ปัญหาตามเว็บต่างๆ ส่วนมากถ้าเป็น PHP, Apache นิยมใช้ HAProxy เป็น proxy ถ้าเป็น Ubuntu สามารถติดตั้งผ่าน APT ได้เลย
sudo aptitude install haproxy
เราต้องการติดต่อกับ internet ด้วย port 80 ซึ่งเดิมรัน Apache web server ไว้อยู่แล้วเลยต้องเปลี่ยน architecture ของ server นิดหน่อยคือวาง HAProxy ขวาง server, app ตัวอื่นๆ และให้ listen ที่ port 80 แล้วค่อยกระจาย request ไปที่ port ต่างๆ ตามรูปข้างล่าง