- OpenWorkers คือ รันไทม์โอเพนซอร์ส สำหรับรัน JavaScript บน V8 ซึ่งทำให้สามารถสร้างเอดจ์คอมพิวติงบนโครงสร้างพื้นฐานของตนเองได้
- รองรับ KV storage, PostgreSQL, สตอเรจที่เข้ากันได้กับ S3/R2, service bindings, environment variables และ secrets
- รักษา ความเข้ากันได้ กับ Cloudflare Workers ในระดับสูง พร้อม Web API หลักอย่าง fetch, ReadableStream, crypto.subtle
- สามารถโฮสต์เองได้อย่างง่ายดายด้วย แซนด์บ็อกซ์ V8 Isolate, การตั้งเวลาแบบ cron, และ การดีพลอยด้วย Docker Compose
- เป็นโปรเจกต์ที่พัฒนามาราว 7 ปี โดยมีเป้าหมายเป็น สภาพแวดล้อมรัน JavaScript ที่ไม่ผูกกับผู้ให้บริการรายใด
ภาพรวม OpenWorkers
- OpenWorkers เป็น รันไทม์ที่เข้ากันได้กับ Cloudflare Workers ซึ่งเขียนด้วย Rust และรัน JavaScript โดยใช้ V8 Isolate
- ทำให้สามารถนำข้อดีของเอดจ์คอมพิวติงมาใช้ในสภาพแวดล้อมเซิร์ฟเวอร์ของตนเองได้
- เปิดซอร์สให้ใช้งาน จัดจำหน่าย และแก้ไขได้อย่างอิสระ
ฟีเจอร์หลัก
- เชื่อมต่อกับทรัพยากรภายนอกหลากหลายผ่านความสามารถด้าน Bindings
- KV storage: รองรับ get, put, delete, list
- เชื่อมต่อกับฐานข้อมูล PostgreSQL
- รองรับ สตอเรจที่เข้ากันได้กับ S3/R2
- รวมถึง service bindings, environment variables และการจัดการ secrets
- รองรับ Web API
- มี API มาตรฐานอย่าง fetch, Request, Response, ReadableStream
- รวม crypto.subtle, TextEncoder/Decoder, Blob, setTimeout, AbortController
สถาปัตยกรรม
- ระบบประกอบด้วย nginx proxy, dashboard, API, บริการล็อก, runner, PostgreSQL, NATS, scheduler เป็นต้น
- แต่ละ runner จะรันโค้ดภายใน V8 Isolate โดยมีข้อจำกัดที่ CPU 100ms และ หน่วยความจำ 128MB
- มี scheduler ในตัว ที่รองรับ ไวยากรณ์ cron แบบ 5–6 ฟิลด์
- คง ความเข้ากันได้ด้านไวยากรณ์ กับ Cloudflare Workers
การโฮสต์เอง
- สามารถดีพลอยได้ด้วยเพียง ฐานข้อมูล PostgreSQL เดียว และ ไฟล์ Docker Compose
- รันได้ง่ายด้วยคำสั่ง
git clone, ตั้งค่า .env, และ docker compose up
- รวมขั้นตอน migration และการสร้างโทเค็นไว้ด้วย
เบื้องหลังการพัฒนา
- เป็นโปรเจกต์ที่ผ่านกระบวนการพัฒนามาราว 7 ปี
- ช่วงแรกทดลองทำ JS sandboxing ด้วย vm2 ก่อนพัฒนาต่อโดยได้แรงบันดาลใจจากโมเดล Cloudflare Workers
- ผ่าน Deno-core และปัจจุบันเขียนใหม่บนพื้นฐาน rusty_v8
- เป้าหมายคือการมอบ ประสบการณ์นักพัฒนา (DX) ระดับ Cloudflare Workers พร้อมสร้าง สภาพแวดล้อมรันบนเซิร์ฟเวอร์ของตนเองที่ไม่ผูกกับผู้ให้บริการรายใด
- ในอนาคตมีแผนเพิ่มความสามารถ deterministic debugging ผ่าน การบันทึกและเล่นซ้ำการทำงาน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
แนวคิดในการนำ พลังของ edge computing มาไว้บนโครงสร้างพื้นฐานของตัวเอง น่าสนใจมาก
แต่ก็รู้สึกว่าการ self-hosting ขัดกับแก่นแท้ของ edge computing อยู่พอสมควร
นี่เป็นโมเดลที่เป็นไปได้เพราะผู้ให้บริการรายใหญ่อย่าง Cloudflare มี PoP (Point of Presence) มากกว่า 300 แห่งทั่วโลก
แน่นอนว่าสามารถประกอบผู้ให้บริการรายเล็กที่ มีจริยธรรมมากกว่า เพื่อสร้างโครงสร้างคล้ายกันได้ แต่ต้องแลกกับความพยายามและความเสี่ยงที่สูงกว่ามาก
คิดว่าแค่มีสัก 10 แห่งในภูมิภาคหลัก ๆ ก็น่าจะพอแล้วหรือเปล่า
แต่ก็แอบกังวลว่าการประสานงานให้ปลอดภัยและเชื่อถือได้จะยากเกินไปหรือเปล่า
ปัญหาของโซลูชัน sandbox คือมันต้องให้ การรับประกันอย่างแข็งแกร่งว่าโค้ดจะไม่สามารถหนีออกจาก sandbox ได้
การพิสูจน์สิ่งนี้ต้องอาศัยผลการทดสอบต่อสถานการณ์โจมตีหลากหลายแบบและเอกสารที่ละเอียดมาก
แต่เอกสารระดับนี้หาได้ยากมาก และแทบหาเคสที่น่าเชื่อถือจริง ๆ ไม่ค่อยได้
เพราะงั้นฉันจึงมักดูว่ามีกรณีที่บริษัทใหญ่ใช้งานจริงใน production และ ทีมความปลอดภัยเป็นผู้ดูแลรักษา หรือไม่
ถึงขั้นนำ V8 release มาใช้ก่อน Chrome เสียอีก
worker แต่ละตัวรันเป็น isolate ไม่ใช่ process แยก ทำให้คล้ายกับโมเดลของ Cloudflare
แต่ถ้าต้องจัดการโค้ดจาก third party ที่ไม่อาจเชื่อถือได้ทั้งหมด ก็ควรแยกเพิ่มอีกชั้นด้วย container หรือ VM
การ sandbox แบบนี้เน้นเรื่องการแยกทรัพยากรมากกว่าความปลอดภัย
การตรวจสอบความปลอดภัยระดับ “เราตรวจแล้วและปลอดภัย เชื่อเราได้” นั้นไม่เพียงพอ
แต่ในสภาพแวดล้อมแบบ self-hosting นั้นมีสิทธิ์เข้าถึงระบบอยู่แล้ว จึงไม่ค่อยต้องกังวลเรื่อง การหลุดออกจาก sandbox มากนัก
คิดว่าเป็นโปรเจ็กต์ที่ยอดเยี่ยม
ถ้า workerd เป็นโอเพนซอร์สอยู่แล้ว ก็สงสัยว่าจุดต่างของ OpenWorkers คือการให้สภาพแวดล้อมแบบครบชุดใช่ไหม
แล้วตัว runtime เองต่างกันอย่างไร หรือมีแผนเรื่อง managed service ในอนาคตหรือไม่
1️⃣ workerd ให้มาแค่ runtime แต่ OpenWorkers เป็นแพลตฟอร์มครบชุดที่รวม dashboard, API, scheduler, logs, bindings (KV, S3/R2, Postgres) มาด้วย
2️⃣ workerd พัฒนาด้วย C++ ส่วน OpenWorkers ใช้ Rust + rusty_v8 จึงเรียบง่ายกว่าและแฮ็กปรับแต่งได้ง่ายกว่า
3️⃣ ตอนนี้มีเวอร์ชัน managed อยู่แล้วที่ dash.openworkers.com และมี free tier ด้วย
แต่ก็ออกแบบโดยให้ self-hosting เป็นพลเมืองชั้นหนึ่ง
แก่นสำคัญของ Cloudflare Workers คือ การคิดค่าบริการตามฟังก์ชัน แต่ถ้าเป็น self-hosting สุดท้ายก็ต้องจัดหา hardware ล่วงหน้าอยู่ดี
ไม่จำเป็นต้องเอาทุกอย่างไปจ้างภายนอกทั้งหมด และการมี ทางเลือกที่คล้ายกัน ก็นับว่าเป็นเรื่องดี
ตัวเลือกแบบนี้ช่วยลดอุปสรรคในการนำไปใช้ได้
เมื่อก่อนเคยทำงานแยก deno_core ออกมาพอสมควร เลยเข้าใจได้ว่าทำไมถึงย้ายไปใช้ raw rusty_v8
ใน deno_core มี โค้ดแบบ legacy อยู่มาก พอแก้ไขทีไรก็มักทำให้เทสต์พังบ่อย
แต่เราเปลี่ยนมาใช้ rusty_v8 เพื่อควบคุมภายในของ runtime ได้ละเอียดขึ้น
และมีแผนจะ เติมฟีเจอร์ที่ยังขาดกลับเข้าไป ใน deno runtime ภายหลัง
ถ้าเป็นโปรเจ็กต์ที่ช่วยลด vendor lock-in ก็สนับสนุนเต็มที่
อยากให้บริการคลาวด์ถูกกดดันให้ตั้งราคาตามความเป็นจริงเสียที
ตอนนี้แม้แต่ฟีเจอร์พื้นฐานอย่าง NAT ก็ยังคิดราคาแพงเกินไป
แน่นอนว่าคลาวด์สะดวก แต่ปัญหาคือ ต้นทุนที่สูงเมื่อเทียบกับการทำเองแบบ DIY
ถ้าบริษัทใหญ่กว้านซื้อทรัพยากรไปหมด คนทั่วไปก็อาจโฮสต์เองได้ยากขึ้น
แต่ในความเป็นจริงแล้ว หลายประเทศมี ต้นทุนการดูแลระบบเองสูงกว่า
เพราะมันไม่ได้จบแค่การติดตั้ง แต่ยังมีค่าคนดูแลและค่ามอนิเตอร์ระบบที่สูงพอสมควร
น่าจะดีถ้าเอกสารระบุให้ชัดว่าตอนนี้ยังมีฟีเจอร์ไหนที่ใช้ไม่ได้หรือมี roadmap อย่างไร
ลำดับถัดไปคือ ฟีเจอร์บันทึก/เล่นซ้ำการทำงานสำหรับดีบัก และจะเพิ่มส่วน roadmap ลงในเอกสารด้วย
ไดอะแกรมสถาปัตยกรรมแบบ ASCII บน Pixel + Firefox ดูเพี้ยน
ไดอะแกรมแบบข้อความมีเสน่ห์ก็จริง แต่ในทางปฏิบัติ การเผยแพร่เวอร์ชันที่คอมไพล์เป็นภาพ น่าจะใช้งานได้จริงกว่า
เป็นไอเดียผลิตภัณฑ์ที่ยอดเยี่ยมทั้งในเชิงเทคนิคและเชิงโครงสร้าง
โดยเฉพาะ โมเดลที่นำโปรเจ็กต์โอเพนซอร์สของผู้ให้บริการรายใหญ่มาตอบแทนกลับด้วยโอเพนซอร์ส ที่ชอบมาก
พูดอีกแบบคือ แทนที่พวกเขาจะหยิบโอเพนซอร์สไปทำเชิงพาณิชย์ ฝั่งเราก็นำโมเดลของพวกเขากลับมาเปิดเป็นโอเพนซอร์สแทน — คิดว่านี่แหละคือแนวทางที่ถูกต้อง
ดูเหมือนกระแส “จะเป็นอย่างไรถ้าเราโฮสต์คลาวด์ไว้บนคอมพิวเตอร์ของตัวเองโดยตรง?” กำลังกลับมาอีกครั้ง
ช่วงนี้เห็น เทรนด์ self-hosting แบบนี้ในหลายที่
วิดีโอบรรยาย ที่เกี่ยวข้องก็น่าสนใจ
แก่นของคลาวด์คือ elasticity
คือสามารถเพิ่มหรือลดจำนวนอินสแตนซ์ตามความต้องการ และจ่ายเท่าที่ใช้จริง
self-hosting แม้จะมีเครื่องมือ deploy ที่สะดวก แต่สุดท้ายก็ต้องรับต้นทุนของทั้งเซิร์ฟเวอร์อยู่ดี
ถ้าโหลดคงที่หรือคาดการณ์ได้ก็โอเค แต่ถ้าไม่ใช่ก็จะไม่มีประสิทธิภาพ
(ถ้าจะเปรียบก็เหมือนความต่างระหว่างการนั่งรถบัสกับการเป็นเจ้าของรถตู้)
นักพัฒนาสามารถโฟกัสกับการเขียน event handler ได้ และถ้ามี queue หรือ durable execution รวมด้วยก็จะยิ่งทรงพลัง
ท้ายที่สุด FaaS คือเครื่องมือระดับสูงที่ช่วย abstract โค้ด boilerplate ออกไป