Skip to content

Pattern การสร้าง real-time application ด้วย Node.js และ MongoDB

real-time app (ผมหมายถึง web application และ service ทั่วไปด้วยอะนะ) ถ้าหาข้อมูลตามอินเทอร์เน็ต เครื่องมือที่นิยมใช้งานคงหนีไม่พ้น Node.js, Socket.io สำหรับฐานข้อมูลอาจจะมีแนะนำให้เลือกใช้แตกต่างกันไปบ้างตามแต่ละงาน แต่ส่วนมากก็จะเป็นพวก NoSQL

โพสต์นี้ถ้าบันทึกโดยอ้างอิงจาก Node.js, Socket.io และ MongoDB เป็นหลักเพราะเป็นเครื่องมือที่เอามาใช้งานบ่อย

หลักการทำ real-time และคุณสมบัติเครื่องมือที่ผม survey ดูสรุปเป็นข้อๆ ตามนี้

  1. ลืม LAMP stack ไปก่อนเพราะถ้าทำ real-time มันไม่ตอบโจทย์แล้ว
  2. real-time เป็นเรื่องระหว่าง client-server ไม่เกี่ยวกับ database ถ้าจะทำ push ก็แยกเป็น 2 ส่วนไปเลยส่วน push ก็ push ไป ส่วนเก็บลง database ก็ทำเก็บไป ถ้าใช้ MongoDB ก็ต้องเก็บข้อมูลลง 2 collections อันหนึ่งเป็น collection ปกติสำหรับเก็บข้อมูลและ capped collection สำหรับ push
  3. MongoDB มีคุณสมบัติที่เรียกว่า capped collection และ tailable cursor ประยุกต์ใช้ทำ real-time ได้
  4. ถ้าใช้ MongoDB กับ Node.js ใช้ Mongoose ODM จะสะดวกกว่ามี api เรียกใช้งาน tailable cursor และ stream ง่ายๆ
  5. Capped collection สามารถทำงานได้เหมือนๆ กับ colleciton ปกติแต่จะมีการกำหนด size ที่แน่นอนไว้ จะ update หรือ insert ข้อมูลเกิน size ทีกำหนดไว้ไม่ได้ และเมื่อเวลาผ่านไปสักระยะหนึ่งมันจะลบ document เก่าทิ้งอัตโนมัติ รายละเอียดอื่นๆ เข้าไปอ่านได้ที่ document ตามอ้างอิงข้างล่างครับ
  6. ก่อนหน้าที่จะรู้จัก capped collection ผมใช้การวนรอบ (ใช้ setInterval) emit event ที่ฝั่ง client เอา ถามว่าทำงานได้ไหม ก็ทำงานได้แต่ overhead ก็สูงกว่าใช้ทรัพยากรเยอะกว่า
  7. socket.io set วิธีรับส่งข้อมูลได้ทั้ง websockets, xhr-polling, jsonp-polling ถ้าเบราว์เซอร์เป้าหมายรองรับ websockets ก็เลือกใช้ตัวนี้จะลด overhead ลงแต่ถ้าเน้นให้ใช้งานได้วงกว้างก็เลือก xhr-polling หรือ jsonp-polling แทน
  8. การใช้งาน websockets ให้ระวังเรื่อง memory leak ถ้า client ไม่มีการใช้งานให้ disconnect แล้วจัดการตัวแปรหรือการทำงานอื่นที่ hold resource ไว้
  9. เพื่อให้ service ทำงานอยู่ตลอดเวลาใช้โปรแกรมพวก process monitor เข้ามาช่วยเช่น monit, forever

อ้างอิง

Be First to Comment

Leave a Reply

Your email address will not be published.