- OpenWorkers là một runtime mã nguồn mở chạy JavaScript trên nền V8, cho phép triển khai edge computing trên hạ tầng riêng
- Hỗ trợ kho lưu trữ KV, PostgreSQL, storage tương thích S3/R2, service bindings, biến môi trường và secret
- Duy trì mức độ tương thích cao với Cloudflare Workers, bao gồm các Web API quan trọng như fetch, ReadableStream, crypto.subtle
- Có thể self-host đơn giản nhờ sandbox V8 Isolate, lập lịch cron, triển khai dựa trên Docker Compose
- Đây là dự án đã phát triển trong khoảng 7 năm, hướng tới môi trường thực thi JavaScript không phụ thuộc nhà cung cấp
Tổng quan OpenWorkers
- OpenWorkers là runtime tương thích Cloudflare Workers được viết bằng Rust, sử dụng V8 Isolate để chạy JavaScript
- Có thể tận dụng lợi thế của edge computing ngay cả trong môi trường máy chủ riêng
- Được phát hành dưới dạng mã nguồn mở, cho phép tự do triển khai và chỉnh sửa
Tính năng chính
- Kết nối với nhiều tài nguyên bên ngoài thông qua tính năng bindings
- KV storage: hỗ trợ get, put, delete, list
- Tích hợp cơ sở dữ liệu PostgreSQL
- Hỗ trợ storage tương thích S3/R2
- Bao gồm service bindings, quản lý biến môi trường và secret
- Hỗ trợ Web API
- Cung cấp các API tiêu chuẩn như fetch, Request, Response, ReadableStream
- Bao gồm crypto.subtle, TextEncoder/Decoder, Blob, setTimeout, AbortController
Kiến trúc
- Hệ thống gồm nginx proxy, dashboard, API, dịch vụ log, runner, PostgreSQL, NATS, scheduler
- Mỗi runner thực thi mã trong V8 Isolate với giới hạn CPU 100ms và bộ nhớ 128MB
- Bao gồm scheduler tích hợp sẵn hỗ trợ cú pháp cron 5~6 trường
- Duy trì tính tương thích cú pháp với Cloudflare Workers
Self-hosting
- Có thể triển khai chỉ với một cơ sở dữ liệu PostgreSQL và một tệp Docker Compose
- Có thể chạy dễ dàng bằng các lệnh
git clone, cấu hình .env, docker compose up
- Bao gồm quy trình migration và tạo token
Bối cảnh phát triển
- Đây là dự án được hoàn thiện sau khoảng 7 năm phát triển
- Ban đầu thử nghiệm sandbox JS với vm2, sau đó phát triển dựa trên cảm hứng từ mô hình Cloudflare Workers
- Đi qua Deno-core và hiện đã được viết lại trên nền rusty_v8
- Mục tiêu là xây dựng môi trường chạy trên máy chủ riêng không phụ thuộc nhà cung cấp, đồng thời mang lại trải nghiệm phát triển (DX) ở mức Cloudflare Workers
- Trong tương lai dự kiến bổ sung debugging xác định (deterministic debugging) thông qua ghi lại và phát lại quá trình thực thi
1 bình luận
Ý kiến trên Hacker News
Khái niệm mang sức mạnh của edge computing về hạ tầng riêng khá thú vị
Nhưng self-hosting có vẻ hơi mâu thuẫn với bản chất của edge computing
Đây là mô hình chỉ khả thi khi một nhà cung cấp lớn như Cloudflare có hơn 300 PoP (Point of Presence) trên toàn thế giới
Dĩ nhiên vẫn có thể ghép các nhà cung cấp có đạo đức hơn để tạo cấu trúc tương tự, nhưng sẽ tốn nhiều công sức và rủi ro hơn rất nhiều
Tôi nghĩ chỉ khoảng 10 điểm ở các khu vực chính có lẽ cũng đã đủ
Nhưng cũng lo rằng việc điều phối sao cho an toàn và đáng tin cậy sẽ quá khó
Vấn đề của các giải pháp sandbox là phải đưa ra được bảo đảm rất mạnh rằng mã không thể thoát khỏi sandbox
Để chứng minh điều đó cần có kết quả kiểm thử cho nhiều kịch bản tấn công cùng tài liệu chi tiết
Nhưng tài liệu ở mức này rất hiếm, và thực tế khó tìm được ví dụ thật sự đáng tin
Vì vậy tôi thường kiểm tra xem có trường hợp nào được các tập đoàn lớn dùng trong môi trường production và được đội ngũ bảo mật duy trì hay không
Thậm chí đôi khi còn áp dụng bản phát hành V8 sớm hơn cả Chrome
Mỗi worker chạy dưới dạng isolate chứ không phải tiến trình riêng, nên tương tự mô hình của Cloudflare
Nhưng khi xử lý mã bên thứ ba hoàn toàn không đáng tin cậy, tốt hơn vẫn nên thêm một lớp cách ly bằng container hoặc VM
Cơ chế sandbox này tập trung vào cách ly tài nguyên hơn là bảo mật
Một cuộc kiểm toán bảo mật kiểu “chúng tôi đã xác minh và nó an toàn, hãy tin chúng tôi” là không đủ
trong môi trường self-hosting thì vốn dĩ đã có quyền truy cập hệ thống nên ít cần lo về sandbox escape hơn
Tôi nghĩ đây là một dự án rất hay
Nếu workerd là mã nguồn mở, thì tôi muốn biết điểm khác biệt của OpenWorkers có phải là cung cấp một môi trường hoàn chỉnh hay không
Tôi cũng muốn biết runtime có khác gì không, và sau này có kế hoạch cho dịch vụ managed hay không
1️⃣ workerd chỉ cung cấp runtime, còn OpenWorkers là một nền tảng hoàn chỉnh gồm dashboard, API, scheduler, log, binding (KV, S3/R2, Postgres)
2️⃣ workerd dựa trên C++, còn OpenWorkers dựa trên Rust + rusty_v8 nên đơn giản hơn và dễ hack hơn
3️⃣ Đã có phiên bản managed tại dash.openworkers.com, và còn có cả free tier
Nhưng self-hosting được thiết kế như công dân hạng nhất
Cốt lõi của Cloudflare Workers là tính phí theo từng hàm, còn nếu self-hosting thì cuối cùng vẫn phải chuẩn bị sẵn phần cứng
Không nhất thiết phải thuê ngoài mọi thứ, và việc có những lựa chọn tương tự là điều tốt
Những lựa chọn như vậy giúp hạ thấp rào cản tiếp cận
Trước đây tôi từng làm khá nhiều việc tách deno_core ra, nên tôi hiểu vì sao lại chuyển sang raw rusty_v8
deno_core có khá nhiều mã legacy, nên mỗi lần chỉnh sửa thì test rất hay bị vỡ
Nhưng để kiểm soát chi tiết hơn bên trong runtime, chúng tôi đã chuyển sang rusty_v8,
và sau này cũng có kế hoạch bổ sung lại các tính năng còn thiếu cho runtime của deno
Nếu đây là dự án giúp giảm phụ thuộc vào vendor, thì tôi hoàn toàn ủng hộ
Tôi hy vọng các dịch vụ cloud sẽ bị gây áp lực để định giá thực tế hơn
Hiện tại họ đang tính phí quá cao ngay cả với những tính năng cơ bản như NAT
Dĩ nhiên cloud rất tiện, nhưng vấn đề là chi phí cao so với tự làm
Nếu các tập đoàn lớn độc chiếm tài nguyên thì cá nhân có thể sẽ ngày càng khó tự host hơn
Nhưng trên thực tế, ở nhiều quốc gia thì chi phí tự vận hành còn lớn hơn
Không chỉ cài đặt là xong, mà còn tốn đáng kể cho nhân sự bảo trì và giám sát
Sẽ tốt hơn nếu tài liệu nêu rõ những tính năng hiện chưa hoạt động và lộ trình phát triển
Ưu tiên tiếp theo là tính năng ghi lại/phát lại để debug khi chạy, và chúng tôi sẽ thêm một mục roadmap vào tài liệu
Sơ đồ kiến trúc ASCII bị vỡ trên Pixel + Firefox
Sơ đồ dạng văn bản thì hấp dẫn thật, nhưng trên thực tế đăng phiên bản biên dịch thành ảnh sẽ thực dụng hơn
Đây là ý tưởng sản phẩm rất xuất sắc cả về mặt kỹ thuật lẫn cấu trúc
Tôi đặc biệt thích mô hình lấy dự án mã nguồn mở của vendor lớn rồi hoàn trả ngược lại bằng mã nguồn mở
Tức là thay vì họ lấy mã nguồn mở để thương mại hóa, chúng ta đưa mô hình của họ trở lại thành mã nguồn mở — tôi nghĩ chính những cách tiếp cận như vậy mới là đúng
Có cảm giác xu hướng “nếu tự host cloud ngay trên máy của mình thì sao?” đang quay trở lại
Gần đây tôi thấy xu hướng self-hosting này xuất hiện ở nhiều nơi
Video bài nói chuyện liên quan cũng khá thú vị
Cốt lõi của cloud là elasticity
Có thể tăng giảm số lượng instance theo nhu cầu và chỉ trả tiền cho phần đã dùng
Self-hosting thì dù công cụ triển khai có tiện đến đâu, cuối cùng vẫn phải gánh chi phí của cả máy chủ
Nếu tải ổn định hoặc có thể dự đoán thì không sao, nhưng nếu không thì sẽ kém hiệu quả
(Ví dụ như sự khác nhau giữa đi xe buýt và sở hữu một chiếc xe van)
Lập trình viên có thể tập trung vào việc triển khai event handler, và nếu có thêm queue hay khả năng thực thi bền vững thì còn mạnh hơn nữa
Cuối cùng thì FaaS là công cụ cấp cao giúp trừu tượng hóa phần mã boilerplate