Vercel รองรับ WebSocket และ socket.io แล้ว · ทำแอป realtime จบในโปรเจกต์เดียว ไม่ต้องตั้งเซิร์ฟเวอร์แยก
Vercel ประกาศรองรับ WebSocket และไลบรารี socket.io อย่างเป็นทางการแล้ว ฟีเจอร์ realtime อย่างแชตหรือการแก้ไขร่วมกันแบบสด จึงทำบน Vercel ได้ในโปรเจกต์เดียว โดยไม่ต้องไปตั้งเซิร์ฟเวอร์ WebSocket แยกอีกต่อไป

Vercel แพลตฟอร์มที่นักพัฒนาเว็บใช้สำหรับนำแอปขึ้นออนไลน์ ประกาศรองรับ WebSocket อย่างเป็นทางการแล้ว WebSocket คือการเชื่อมต่อแบบเปิดค้างไว้สองทางระหว่างเบราว์เซอร์กับเซิร์ฟเวอร์ เป็นพื้นฐานของงาน realtime หลายแบบ และครั้งนี้ Vercel ยังรองรับไลบรารี socket.io ที่ช่วยให้เขียนงานแบบนี้ง่ายขึ้นด้วย แปลว่าตั้งแต่นี้ ฟีเจอร์ realtime อย่างแชต · การอัปเดตหน้าจอแบบสด · งานแก้ไขเอกสารร่วมกัน หรือการแจ้งเตือนทันที สร้างบน Vercel ได้ในโปรเจกต์เดียวจบ โดยใช้ไลบรารี Node.js มาตรฐานที่นักพัฒนาคุ้นมืออยู่แล้ว
จุดที่ทำให้ข่าวนี้น่าสนใจไม่ใช่คำว่า "realtime" เฉย ๆ แต่เป็นคำว่า "ในโปรเจกต์เดียว" ที่ผ่านมา คนที่อยากใส่ฟีเจอร์ realtime ให้แอปบน Vercel มักเจอปัญหาเดิมซ้ำ ๆ คือต้องไปตั้งเซิร์ฟเวอร์ WebSocket แยกอีกที่หนึ่ง ตอนนี้ข้อจำกัดนั้นหมดไปแล้ว
ทำไมงาน realtime ถึงต้องใช้ WebSocket

WebSocket ต่างจากวิธีที่เว็บปกติคุยกันตรงไหน ตรงนี้คือหัวใจของเรื่อง เวลาเปิดเว็บทั่วไป เบราว์เซอร์จะส่งคำขอไปหาเซิร์ฟเวอร์หนึ่งครั้ง เซิร์ฟเวอร์ตอบกลับมาหนึ่งครั้ง แล้วการเชื่อมต่อก็จบ รูปแบบนี้เรียกว่า request-response เหมาะกับการโหลดหน้าเว็บ แต่ไม่เหมาะกับงานที่ข้อมูลต้องวิ่งเข้าออกตลอดเวลา
ลองนึกถึงหน้าแชต ถ้าใช้แบบ request-response เบราว์เซอร์ต้องคอยถามเซิร์ฟเวอร์ซ้ำ ๆ ว่า "มีข้อความใหม่ไหม" ทุกไม่กี่วินาที ซึ่งทั้งช้าและเปลืองโดยไม่จำเป็น
WebSocket แก้ปัญหานี้ด้วยวิธีคิดที่ต่างออกไป มันเปิดการเชื่อมต่อเส้นเดียวระหว่างเบราว์เซอร์กับเซิร์ฟเวอร์แล้วค้างไว้ ข้อมูลจึงวิ่งได้สองทางตลอดเวลา เมื่อฝั่งเซิร์ฟเวอร์มีข้อความใหม่ ก็ส่งหาเบราว์เซอร์ได้ทันทีโดยไม่ต้องรอให้ถาม นี่คือเหตุผลที่งาน realtime เกือบทุกอย่าง ตั้งแต่แชตไปจนถึงเคอร์เซอร์ของเพื่อนร่วมงานที่ขยับบนหน้าจอเดียวกัน ล้วนวางอยู่บน WebSocket
ทำไมแต่ก่อน Vercel ถึงทำ realtime ยาก
ปัญหาอยู่ที่ธรรมชาติของ serverless ซึ่งเป็นรูปแบบที่ Vercel ถนัด
serverless ทำงานเป็นช่วงสั้น ๆ เมื่อมีคำขอเข้ามา ฟังก์ชันก็ตื่นขึ้นมาทำงาน ทำเสร็จก็ดับ และมีเพดานเวลาทำงานจำกัด ที่สำคัญคือมันไม่จำสถานะข้ามรอบการทำงาน รอบนี้ทำงานเสร็จ รอบหน้าก็เหมือนเริ่มใหม่หมด
วิธีคิดแบบนี้ขัดกับ WebSocket โดยตรง เพราะ WebSocket ต้องการการเชื่อมต่อที่เปิดค้างไว้นาน ๆ ไม่ใช่ทำงานแวบเดียวแล้วดับ พอสองอย่างนี้เข้ากันไม่ได้ นักพัฒนาที่อยู่บน Vercel จึงต้องหาทางออกนอก Vercel
ทางออกเดิมที่ต้องพึ่งระบบนอก Vercel
ก่อนหน้านี้คนที่ติดปัญหานี้มักเลือกหนึ่งในสองทาง และทั้งสองทางมีต้นทุนที่ต้องรับ
- ตั้งเซิร์ฟเวอร์ WebSocket แยกเอง ยกส่วน realtime ไปไว้บนเซิร์ฟเวอร์อีกตัวที่เปิดค้างได้ตลอด ข้อดีคือคุมเองได้หมด แต่แลกมาด้วยการต้องดูแล infra อีกชุดหนึ่ง ทั้งการ deploy การสเกล และค่าใช้จ่ายที่เพิ่มขึ้น
- ใช้บริการ realtime ของเจ้าอื่น ต่อแอปเข้ากับบริการสำเร็จรูปที่รับงาน realtime ให้ ข้อดีคือไม่ต้องดูแลเซิร์ฟเวอร์เอง แต่แลกมาด้วยการพึ่งระบบนอกอีกชั้น และต้องเรียนรู้เครื่องมือใหม่นอกเหนือจากที่ใช้อยู่
จะเลือกทางไหนก็ตาม ผลลัพธ์เหมือนกันคือฟีเจอร์ realtime กลายเป็นชิ้นส่วนที่อยู่คนละที่กับโค้ดหลักของแอป ต้องคิดเรื่องการเชื่อมสองระบบและดูแลสองฝั่งไปพร้อมกัน
ตอนนี้เปลี่ยนไปยังไง

สิ่งที่ Vercel ประกาศคือ ตอนนี้ WebSocket ทำงานบนแพลตฟอร์มของ Vercel ได้โดยตรง ครอบคลุมตั้งแต่ชั้น CDN ไปจนถึง Fluid ซึ่งเป็นรูปแบบการประมวลผลของ Vercel นักพัฒนาจึงเขียนส่วน realtime ด้วยไลบรารี Node.js มาตรฐานอย่าง ws หรือ socket.io ในโปรเจกต์เดียวกับโค้ดหลักได้ ไม่ต้องแยกไปไว้อีกที่
บทเรียนสำคัญที่ Guillermo Rauch ซีอีโอของ Vercel มองว่าเป็นจังหวะที่เรื่องวนกลับมาครบรอบ คือ Vercel เริ่มต้นจากโลกของ serverless ที่ทำงานเป็นช่วงสั้น ๆ ตอนนี้แพลตฟอร์มเดียวกันก้าวมารองรับการเชื่อมต่อแบบเปิดค้างได้แล้ว สองโลกที่เคยเข้ากันไม่ได้จึงมาบรรจบกันบนแพลตฟอร์มเดียว
ฟีเจอร์ realtime ไม่ต้องแยกไปอยู่อีกระบบจากแอปอีกต่อไป
ก่อนจะรีบย้าย ขอเช็กของจริงก่อน
ของใหม่ที่เพิ่งประกาศมักทำให้ตื่นเต้น แต่จุดที่ต้องระวังคือ สิ่งที่ยืนยันได้ชัดตอนนี้มีแค่ "Vercel รองรับ WebSocket และ socket.io แล้ว" เท่านั้น
ประกาศยังไม่ยืนยันรายละเอียดอีกหลายข้อ เช่น ต้องเปิดใช้ Fluid เป็นพิเศษไหม รองรับทุกแพลนหรือเฉพาะบางแพลน มีลิมิตจำนวน connection ระยะเวลาที่เปิดค้างได้ หรือ region ที่ใช้ได้แค่ไหน และคิดค่าใช้จ่ายอย่างไร
ถ้าอยากดูเงื่อนไขก่อนตัดสินใจ เริ่มจากอ่านเอกสารเรื่อง WebSockets ของ Vercel แล้วดูฝั่งไลบรารีที่ Socket.IO ควบคู่กันไป จะเห็นชัดขึ้นว่ารองรับอะไรบ้าง และเข้ากับงานที่เราคิดไว้หรือเปล่า
สิ่งที่ข่าวนี้บอกจริง ๆ
ข่าวนี้ไม่ใช่บทเรียนสอนเขียนแชต และไม่ได้แปลว่าทุกคนต้องรีบย้ายของทันที แต่เป็นการเปลี่ยนแปลงระดับแพลตฟอร์มที่ทำให้ทางเลือกหนึ่งซึ่งเคยปิดอยู่ กลับมาเป็นตัวเลือกให้พิจารณา
สำหรับนักพัฒนาที่อยู่บน Vercel อยู่แล้วและเคยคิดว่างาน realtime ทำที่นี่ไม่ได้ ข่าวนี้ลบความเชื่อนั้นทิ้งไป เงื่อนไขเดิมที่เคยบังคับให้ต้องออกไปตั้งเซิร์ฟเวอร์แยกหรือพึ่งบริการนอก ตอนนี้หมดไปแล้ว ทางที่เคยตันจึงเปิดให้เดินต่อได้
ที่น่าคิดต่อคือ เมื่อแพลตฟอร์มที่เคยทำได้แค่งานสั้น ๆ เริ่มรับงานที่ต้องเปิดค้างได้ เส้นแบ่งระหว่าง "serverless" กับ "เซิร์ฟเวอร์จริง" ก็ค่อย ๆ จางลงทุกที
ที่มา: โพสต์ Guillermo Rauch (@rauchg) on X จาก Guillermo Rauch



