Real Time Web: Next generation website

เคยทวิตไว้นานแล้วครับ เกี่ยวกับเรื่อง Real Time Web เลยขอเก็บมาเขียนบล็อคเดี๋ยวจะกลายเป็นบล็อคอนิเมะไปซะได้ (ที่ BG เป็นรูปอนิเมะเนื่องจากผมต้องการผูก [menome profile](http://menome.sunburn.in.th/whs)​ โปรเจกท์ใหม่ของผม เข้ากับบล็อคครับ สักพักคงจะกลับมาเป็นแบบธรรมดาๆ)

Web 2.0 คงจะได้นิยามเป็น Web+Social ครับ เราผลัดจากการเป็นผู้ผลิตเนื้อหา เป็นผู้ผลิตแพลตฟอร์มสำหรับเนื้อหา ผมเองก็ใช้แนวคิดนี้กับ menome “Social+anime” เรามี Wiki ให้ผู้ใช้สามารถจัดการอัพเดตได้ (แต่ต้องอนุมัติก่อนอยู่ดี) แต่บางจุดพื้นฐานอย่างการเพิ่มอนิเมะก็ต้องมีแอดมินที่ทำหน้าที่ตรงนี้ เพื่อไม่ให้เกิดปัญหาเน่าเสียแบบ foursquare แต่เว็บทุกวันนี้เราก้าวไปด้วย HTML5 แล้ว อะไรละคือยุคถัดไป?

คำตอบของผมคงจะเป็น Real-time web ครับ อาจจะว่า เอ๊ะ มันมีคนใช้หรอ? ที่เราเห็นชัดเจนคงเป็น Twitter นั่นแหละครับ วันแรกที่ผมสัมผัส user stream มันว้าวววมาก (ผมเขียน client เองเลยได้ใช้ก่อนคนอื่นหลายเดือน) จากที่เราต้องรอตอบเมนชั่นสามนาที ห้านาที สิบนาที นั่งกดรีเฟรชรอคำตอบ เราสามารถจะตอบสนองกันได้ทันที ทุกวันนี้เราก็คงเคยชินกับ real-time web ใน notification ของเฟสบุ๊คแล้ว ไม่ต้องนั่งรีเฟรชแค่เปิดเว็บทิ้งไว้ก็ไม่พลาดอัพเดต

ถามว่า เอ๊ะ แล้วเว็บไซต์ทั่วไปจะได้ใช้หรอ? ผมว่าถ้าเว็บที่เป็น 2.0 อยู่แล้วได้ใช้อยู่แล้วครับ การเคลื่อนไหวมันเร็ว น่าจะต้องกระจายออกไปให้ผู้ใช้เร็วขึ้น

หรืออย่างบล็อคผมเนี่ยครับ ก็ใช้ [pubsubhubbub](https://code.google.com/p/pubsubhubbub/) protocol (ลองอ่านชื่อเร็วๆ สิบรอบดู) ถ้า feed reader ใครรองรับก็จะพบว่าพอผมอัพบล็อคจะขึ้นอัพเดตในทันทีเลย ซึ่งใน menome ผมก็ implement pubsubhubbub ไว้ อย่างบล็อคผมนี้เวลาอัพแล้วใน menome ก็จะขึ้นอัพเดตในทันที ทำให้คนอ่านไม่ต้องมานั่งเข้าบล็อคผมทุกวันๆ เพื่อหาข่าว และยังประหยัดเวลา polling ด้วย​ (menome poll blog 30 นาทีครับ)

สำหรับใน HTML5 เองก็มี WebSocket ที่มาตอบโจทย์นี้ครับ เซิร์ฟเวอร์สามารถพุช event เข้ามาหาผู้ใช้ได้ในทันที และแน่นอนคำว่าทันทีคือทันทีจริงๆ ครับ ไม่มี delay จาก polling interval ต่างๆ เลย ใน [live.bd2.in.th](http://live.bd2.in.th) ก็ใช้ websocket ในการอัพเดตข่าว DJ ครับ เมื่อ DJ กด enter แทบจะเรียกได้ว่าวินาทีเดียวกับที่ดีเจได้รับข้อความว่าอัพเดตเรียบร้อยแล้ว ฝั่งคนฟังก็สามารถเห็นข้อความนั้นได้ทันทีแล้วครับ

ปัญหาของ Realtime Web ตอนนี้คือการ implement ไม่ง่ายครับ Apache แสดงอายุมันออกมาแล้วโดยเฉพาะ connection นานๆ แบบนี้ถ้าไม่ใช่ event based คงไม่รอด ฝั่ง nginx เองก็มี plugin ที่ทำงานนี้ครับ (รู้สึกว่าจะไม่ใช่ WebSocket อยู่ดี) แต่ที่มาแรงตอนนี้เลยคือ [nodejs](http://nodejs.org) ครับ ใน bd2.in.th ก็ใช้

แน่นอน nodejs ไม่ใช่ภาษาที่คุ้นเคยแบบ PHP ครับ มันเป็น JavaScript แถมเป็น Async อีก (ลองหา mongodb driver ใน nodejs driver สิครับ แล้วจะรู้ว่า async นรกมาก) ฉะนั้นคนใช้เลยน้อย ของ menome ผมเองยังบอกเลยว่าไม่ทำ websocket ใช้ poll 60 วิแทนเพราะไม่ได้ไหลเร็วขนาดนั้น และก็ขี้เกียจเขียนหลายตัว ขี้เกียจเปิดพอร์ตเพิ่ม

อีกอย่างนึงคือผมเห็นใจคนที่ใช้แชร์โฮสต์ด้วยแหละครับ ในอดีตเรามีฟรีโฮสต์ เอา HTML ไปฝากก็พอ ใครใช้ CMS นั่นกระแดะ ยุคต่อมาใน 2.0 PHP เป็นสิ่งสำคัญที่ขาดไม่ได้ และนั่นคือแชร์โฮสต์ แต่ในยุค 3.0 แบบนี้ nodejs ไม่ใช่จะจัดการง่ายแบบ Apache PHP แล้วครับ คงต้องเพิ่มไปถึงขั้น VPS และ VPS เองก็เป็นปัญหาการจัดการทั้งผู้ดูแล (ที่ต้องเรียนวิธีใช้ลินุกซ์ แถมจ่ายแพงกว่าแชร์โฮสต์อีก) จนไปถึงผู้ให้บริการ (เพราะก็ต้องหาเครื่องมาทำ VPS ที่กินทรัพยากรมากขึ้น) ซึ่งแชร์โฮสต์เองมีมานานแล้ว แต่ VPS นี่ก็เพิ่งได้รับความนิยมครับ

(จริงๆ แล้วโฮสต์ node จริงๆ จังๆ ก็มีเช่น heroku/Joyent แต่พวกนี้ใช้ระบบของตัวเองครับ ใครจะเปิดก็ต้องไปลงทุน R&D มาทำให้ราคามันยังแพง)