Skip to main content
AI & Technology

อยากใช้ Workers API บนเครื่องตัวเอง? รู้จัก Deno celld และข้อแลกเปลี่ยน

celld เป็นโครงการ open source จาก Deno สำหรับรันแอปที่ใช้ Cloudflare Workers API บนเครื่องของเรา จุดน่าสนใจคือ deploy manifest โดยไม่ restart node และส่ง resource ผ่าน bindings แต่ยังมีขอบเขตความเข้ากันได้และข้อจำกัดด้านความปลอดภัยที่ต้องรู้

10 ต.ค. 20268 นาทีDeno celld, Cloudflare Workers
DenoCloudflare WorkerscelldSoftware ArchitectureDeployment
ภาพประกอบสร้างด้วย AI แสดงผู้ดูแลระบบกำลังตรวจ deployment ในห้องเซิร์ฟเวอร์จำลอง ไม่ใช่บุคลากร ระบบ หรือสถานที่จริงของ Enersys หรือลูกค้า
ภาพประกอบสร้างด้วย AI เป็นภาพจำลองการตรวจ deployment ในห้องเซิร์ฟเวอร์ ไม่ใช่บุคลากร ระบบ หรือสถานที่จริงของ Enersys หรือลูกค้า

การปล่อยโค้ดใหม่ไม่จำเป็นต้องแปลว่าต้องหยุดทุก node แล้วเริ่ม process ใหม่เสมอไป โครงการ open source ชื่อ celld จาก Deno เสนอรูปแบบหนึ่งสำหรับแอปที่เขียนด้วย Cloudflare Workers API: ส่ง deployment manifest ไปยัง object storage แล้วให้ node ที่กำลังทำงานรับเวอร์ชันใหม่มาใช้ระหว่างทาง

ขอแยกชื่อให้ชัดก่อน celld เป็นโครงการของ Deno สำหรับ self-host ไม่ใช่ผลิตภัณฑ์ของ Cloudflare และไม่ได้เป็นคำรับรองอย่างเป็นทางการว่าทุก Workers application ย้ายไปรันที่อื่นได้โดยไม่แก้โค้ด เป้าหมายคือให้ runtime และบริการบางส่วนมีรูปแบบคล้าย Workers บนเครื่องที่เราดูแลเอง โครงการและเอกสาร celld ระบุว่ารองรับ Workers, Durable Objects, KV, Queues, D1, R2, Workflows, Cron Triggers และ static assets ในขอบเขตที่กำหนด

Deploy โดยไม่ restart หมายถึงอะไร

ใน celld หนึ่ง process บนเครื่องหนึ่งเครื่องเรียกว่า node ส่วน node ที่ใช้ bucket เดียวกันรวมเป็น fleet แอปถูก deploy เป็น bundle และ manifest ลง bucket ที่รองรับ เช่น S3-compatible storage, Google Cloud Storage หรือ Azure Blob Storage

เมื่อ deploy เวอร์ชันใหม่ node จะตรวจ deploy/current.json ตามช่วงเวลาที่กำหนด ค่าเริ่มต้นในเอกสารคือทุก 30 วินาที แล้วนำ deployment ใหม่มาใช้โดยไม่ restart process คำขอที่เริ่มทำงานด้วยโค้ดรุ่นเก่าจะทำต่อด้วยรุ่นเดิม ส่วน Durable Object ที่ยัง active จะย้ายไปใช้รุ่นใหม่เมื่อไม่มีงานที่กำลังทำอยู่ หรือเมื่อถึงเวลาบังคับย้ายตามค่าที่ตั้งไว้ ขั้นตอน deploy และการเปลี่ยนเวอร์ชัน

คำว่า “ไม่ restart” จึงหมายถึง ไม่ต้องเริ่ม node process ใหม่เพื่อรับ deployment ไม่ได้หมายความว่าทุก request เปลี่ยนรุ่นพร้อมกัน หรือไม่มีช่วงที่โค้ดสองรุ่นทำงานอยู่ร่วมกัน ช่วงเปลี่ยนผ่านอาจทำให้ Worker รุ่นหนึ่งเรียก Durable Object ที่อยู่คนละรุ่นได้ โค้ดที่คุยกันจึงควรรองรับข้อมูลและรูปแบบคำสั่งของรุ่นก่อนหน้าอย่างน้อยในช่วง rollout

ถ้า cell ยังทำงานนานเกินค่า CELLD_DEPLOY_MAX_AGE_S ซึ่งเอกสารกำหนดค่าเริ่มต้นไว้ 60 วินาที celld อาจบังคับย้าย โดยยกเลิกงานที่กำลังทำและปิด WebSocket แบบปกติด้วยรหัส 1012 ส่วน hibernatable WebSocket มีวิธีจัดการต่างออกไป ทีมจึงควรทดสอบกรณี request ยาวและการ reconnect ด้วย ไม่ใช่ดูแค่ว่า node ยังรันอยู่หรือไม่

แนวคิดนี้มีประโยชน์เมื่อทีมต้อง deploy บ่อย แต่ไม่อยากผูกการปล่อยแอปเข้ากับการ restart fleet ทุกครั้ง อย่างไรก็ดี การอัปเกรดตัว celld เองเป็นอีกงานหนึ่ง ซึ่งต้องทำตามข้อกำหนดของแต่ละเวอร์ชัน การเปลี่ยน runtime binary ไม่ใช่การ deploy แอปแบบเดียวกัน

Bindings คล้ายการส่ง dependency ให้แอป แต่ไม่ใช่ DI container

Cloudflare Workers รับ resource ที่ประกาศไว้ใน configuration ผ่าน env เช่น D1 database, queue หรือ object storage เอกสาร Cloudflare เรียกกลไกนี้ว่า bindings ซึ่งเป็นช่องทางให้ Worker เรียก resource หรือ API ที่ runtime จัดเตรียมไว้ Cloudflare Workers bindings

มองในเชิงออกแบบได้ว่า runtime เป็นผู้จัด resource ให้แอป แต่ไม่ควรเรียกสิ่งนี้ว่า DI container เต็มรูปแบบ มันไม่ได้ประกอบ object graph ของแอปหรือแก้ dependency ให้อัตโนมัติ นักพัฒนายังต้องกำหนดว่า service จะเรียก resource เหล่านั้นอย่างไร

ตัวอย่าง Order API อาจแยก business logic ออกจาก SDK ของ runtime ด้วย interface ของตัวเอง:

interface OrderStore {
  save(order: Order): Promise<void>;
}

interface ReviewJobs {
  publish(orderId: string): Promise<void>;
}

function createOrderService(deps: {
  orders: OrderStore;
  reviewJobs: ReviewJobs;
}) {
  return {
    async submit(order: Order) {
      await deps.orders.save(order);
      await deps.reviewJobs.publish(order.id);
    },
  };
}

ใน Worker handler ทีมอาจสร้าง D1OrderStore(env.ORDERS_DB) กับ QueueReviewJobs(env.REVIEW_JOBS) แล้วส่งให้ createOrderService() ส่วน unit test ส่ง fake store และ fake queue เข้ามาแทนได้ จุดที่แยกออกคือ business service รู้จัก interface ของงาน ไม่ต้องรู้ว่าการบันทึกใช้ D1 หรือส่งคิวผ่าน SDK ตัวไหน แต่ adapter และ binding configuration ยังต้องเขียนและทดสอบแยกกัน

ถ้าจะย้าย runtime ในอนาคต ต้องทำ adapter ของ resource ปลายทาง และตรวจพฤติกรรมจริงของแต่ละ service เช่น transaction, retry, ordering, timeout และ error handling ชื่อ binding ที่เหมือนกันไม่ได้รับประกันว่า semantics เหมือนกัน

การแยกขอบเขตแบบนี้ช่วยให้ทีมตกลงเจ้าของงานกันได้ง่ายขึ้น: ทีมแอปดูแลกฎธุรกิจและ interface, ทีม platform ดูแล adapter กับการตั้งค่า runtime, ส่วนทีมโครงสร้างพื้นฐานดูแล node, network และ storage งานที่เปลี่ยน adapter จึงมีจุดทดสอบชัด และการเพิ่ม runtime ใหม่ไม่จำเป็นต้องแก้ business logic ทุกจุด นี่เป็นผลจากการออกแบบของทีม ไม่ใช่ความสามารถที่ celld สร้างให้เอง

Cell กับ state: แยกข้อมูลตาม entity ได้ แต่ต้องเข้าใจรูปแบบการเก็บ

celld ใช้แนวคิด Durable Object ที่เรียกว่า cell แต่ละ cell มีชื่อและฐานข้อมูล SQLite ของตัวเอง เหมาะกับงานที่มีขอบเขตชัด เช่น ห้องสนทนา เอกสาร ผู้ใช้ หรือ AI agent หนึ่งตัว แต่ละตัวจัดการ state ของตัวเองผ่าน event และไม่แชร์ฐานข้อมูล SQLite กับ cell อื่น ภาพรวม cells และ lifecycle

อย่าสับสนระหว่าง state ของ cell กับไฟล์ใน R2: SQLite และข้อมูลที่ใช้กู้คืนถูกจัดการตามกลไก durability ของ celld โดยมี bucket เป็นที่เก็บระยะยาว ส่วน R2 binding ใช้กับ object storage โดยตรงและมี semantics ของตัวเอง การเลือกว่าอะไรควรอยู่ใน cell, D1 หรือ object storage จึงยังเป็นการออกแบบข้อมูลของแอป ไม่ได้เกิดขึ้นให้อัตโนมัติจากคำว่า serverless

มีผลต่อ latency ด้วย เอกสารระบุว่า node เดียวต้องรอการเขียนไปยัง bucket เพื่อยืนยัน durability ขณะที่ fleet ที่มีหลาย node อาจจำลอง write ไปยัง node อื่นก่อนส่งขึ้น bucket ภายหลัง จึงไม่ควรคาดว่าโหมด self-host จะให้ต้นทุนหรือความเร็วเหมือนผู้ให้บริการ edge โดยอัตโนมัติ ต้องทดสอบกับตำแหน่ง object storage, จำนวน node และลักษณะ write ของงานจริง รายละเอียด durability

เช็กขอบเขตก่อนคิดเรื่องย้ายงาน

เอกสาร celld ระบุว่ารับเฉพาะส่วนหนึ่งของ Wrangler configuration และ Workers API หากมี key หรือความสามารถที่ไม่รองรับ deployment จะถูกปฏิเสธ ควรเริ่มจากตาราง compatibility ของบริการที่แอปใช้จริง แล้วทดลอง build, deploy และทดสอบ behavior ทีละ binding อย่าตีความว่าใช้ Workers API ได้เท่ากับได้ Cloudflare parity ทุกบริการหรือทุก edge feature

ข้อจำกัดด้านความปลอดภัยยิ่งต้องอ่านก่อนทดลองกับข้อมูลจริง ณ เอกสารที่ตรวจ รุ่น v0.6.2 ถูกระบุเป็น beta และยังไม่ปลอดภัยสำหรับ hostile multi-tenant use หนึ่ง fleet รันได้หนึ่งแอป และ runtime เชื่อถือโค้ดแอปกับผู้ดูแล fleet ดังนั้นไม่ควรรันโค้ดของ tenant ที่ไม่ไว้วางใจกันใน fleet เดียว ข้อจำกัด และ ขอบเขตความปลอดภัย

celld ไม่ terminate TLS ให้ listener ทั้ง public และ internal เป็น HTTP ต้อง terminate TLS ที่ reverse proxy หรือชั้นหน้าแอป และเก็บ internal listener กับ peer traffic ไว้บน private network หรือ encrypted overlay ห้ามเปิด internal port สู่ internet; HMAC ช่วยยืนยันบางคำขอ แต่ไม่ได้เข้ารหัส peer traffic

ควรทดลองเมื่อไร

celld น่าศึกษาเมื่อทีมมีเหตุผลจะ self-host, ต้องการใช้ programming model ที่คุ้นกับ Workers, มีระบบ object storage และทีมพร้อมดูแล fleet, network, TLS termination, observability, backup, recovery และการอัปเกรดเอง จุดที่น่าหยิบไปใช้ได้แม้ยังไม่เลือก celld คือแยก business logic ออกจาก runtime bindings ด้วย adapter ที่ทดสอบได้

การย้ายยังควรมีแบบจำลองต้นทุนก่อนตัดสินใจ แยกค่า compute ของ node, object storage และ request, network ingress/egress, redundancy, backup ตลอดจนเวลาคนที่ดูแล runtime ออกจากกัน ถ้าแยก fleet ตามแอป การเทียบต้นทุนระดับแอปอาจตรงไปตรงมาขึ้น แต่การคิดต้นทุนต่อ tenant ใน SaaS ต้องมี telemetry และกติกาจัดสรรของแอปเอง เพราะ binding ไม่ได้บันทึกต้นทุนบัญชีให้ และ celld ไม่ได้ให้ isolation สำหรับ tenant ที่ไม่ไว้วางใจกัน การเปรียบเทียบควรใช้ workload จริงและรวมค่าเดินระบบ ไม่ตั้งต้นจากสมมติฐานว่า self-host จะถูกกว่า

ถ้าแอปพึ่งบริการเฉพาะของ Cloudflare, ต้องใช้เครือข่าย edge, ต้องแยก tenant ที่ไม่เชื่อใจกัน หรือองค์กรยังไม่มีคนดูแล node และ private network อย่าเริ่มจากย้าย production ให้ทำ compatibility spike กับข้อมูลจำลองก่อน ระบุ API ที่ใช้, test cases, วิธี rollback และเกณฑ์หยุดทดลองให้ชัด

สำหรับทีมที่อยากประเมินจริง ลองเริ่มจาก service เล็กหนึ่งตัว เช่น Order API ที่อ่าน D1 และส่งงานตรวจเข้า Queue แล้วทดสอบชุดเดียวกันทั้งใน Cloudflare runtime และ celld การทดลองจะตอบได้ตรงกว่าคำว่า “portable” ว่า business logic ส่วนใดย้ายได้ และส่วนใดยังผูกกับ infrastructure

แหล่งข้อมูล: Deno celld บน GitHub, เอกสาร celld, ข้อจำกัดของ celld, ความปลอดภัยของ celld, Cloudflare Workers bindings

ภาพประกอบสร้างด้วย AI เป็นภาพจำลองผู้ดูแลระบบตรวจ deployment ในห้องเซิร์ฟเวอร์ ไม่ใช่ภาพบุคลากร ระบบ หรือสถานที่จริงของ Enersys หรือลูกค้า

คุยกับทีม Enersys เรื่องระบบซอฟต์แวร์และโครงสร้างพื้นฐาน

บทความที่เกี่ยวข้อง

AEO + SEO — คู่มือเอาตัวรอดเมื่อ AI กลืนกิน Google Search

Gartner ทำนาย Search Volume จะลด 25% ภายในปี 2026 และ 50% ภายในปี 2028 — Zero-click search พุ่ง 65% เว็บไซต์ที่ไม่ปรับตัวจะหายไปจากสายตาลูกค้า บทความนี้คือคู่มือฉบับสมบูรณ์สำหรับธุรกิจไทย

AEO vs GEO — เจาะลึกสองกลยุทธ์ที่ตัดสินว่า AI จะ "เห็น" หรือ "ข้าม" เว็บไซต์คุณ

Web Mentions สัมพันธ์กับ AI Citations สูงกว่า Backlinks ถึง 3 เท่า, AI referral traffic โต 527% YoY, เว็บที่มี Schema มีโอกาสถูก AI อ้างอิงมากกว่า 2.5 เท่า — คู่มือเชิงลึก AEO vs GEO พร้อมวิธีตรวจสอบและปรับเว็บไซต์

Agentic AI ในองค์กร — จาก 5% สู่ 40% ภายในปี 2026: โอกาสและความเสี่ยงที่ผู้บริหารต้องรู้

ตลาด Agentic AI โตจาก $1B สู่ $9B+ ใน 2 ปี Gartner คาด 40% ของแอปองค์กรจะมี AI Agent ภายในสิ้นปี 2026 แต่กว่า 40% ของโปรเจกต์อาจถูกยกเลิก — บทความนี้วิเคราะห์โอกาส ความเสี่ยง และกลยุทธ์สำหรับองค์กรไทย

"Empowering Innovation,
Transforming Futures."

บอกเราว่างานส่วนไหนที่คุณต้องการปรับ