1. Cài đặt và cấu hình Runtime WasmEdge cho OpenFaaS
Để chạy các function Wasm thay vì Docker container, ta cần thay thế runtime mặc định của OpenFaaS bằng WasmEdge. WasmEdge là runtime WebAssembly tối ưu, khởi động cực nhanh và tiêu thụ tài nguyên thấp.
Tại sao cần làm điều này: Container Docker thường mất 100-500ms để khởi động (cold start), trong khi WasmEdge chỉ mất 1-5ms. Điều này giúp giảm chi phí và tăng tốc độ phản hồi cho các workload ngắn.
Đầu tiên, ta cần cài đặt WasmEdge vào Node Kubernetes đang chạy OpenFaaS. Giả sử bạn đang truy cập vào một node worker của cluster.
Thực hiện cài đặt WasmEdge bằng lệnh sau:
curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/setup.sh | sudo bash
Kết quả mong đợi: Script sẽ tải và cài đặt WasmEdge, các thư viện phụ thuộc và plugin cần thiết. Bạn sẽ thấy thông báo "WasmEdge installed successfully".
Để OpenFaaS có thể sử dụng WasmEdge, ta cần cấu hình service gateway để gọi runtime này. Ta sẽ chỉnh sửa ConfigMap `openfaas-fn` hoặc tạo một custom runtime. Ở đây, ta sẽ cập nhật file cấu hình để định hướng traffic Wasm.
Chỉnh sửa file cấu hình của OpenFaaS để thêm runtime WasmEdge:
cat > /etc/openfaas-fn/configmap-wasm.yaml
Kết quả mong đợi: ConfigMap được tạo thành công trong namespace openfaas, chứa thông tin runtime để OpenFaaS gọi WasmEdge.
Áp dụng cấu hình vào cluster:
kubectl apply -f /etc/openfaas-fn/configmap-wasm.yaml
Kết quả mong đợi: Lệnh trả về "configmap/openfaas-wasm-runtime created".
2. Xây dựng và biên dịch Function Wasm bằng Rust
Bây giờ ta sẽ viết một function đơn giản bằng Rust, biên dịch nó thành file .wasm và chuẩn bị để deploy lên OpenFaaS.
Tại sao dùng Rust: Rust có công cụ biên dịch `wasm-pack` mạnh mẽ, hỗ trợ xuất ra WebAssembly chuẩn (System Interface Proposal) phù hợp cho server-side runtime như WasmEdge.
Tạo thư mục dự án và khởi tạo project Rust mới:
mkdir -p ~/wasm-func && cd ~/wasm-func
cargo init --name wasm-greet
cargo add wasm-bindgen
Kết quả mong đợi: Thư mục `wasm-greet` được tạo với cấu trúc project Rust chuẩn, bao gồm file `Cargo.toml`.
Sửa file `src/lib.rs` để viết logic xử lý request. Logic này sẽ nhận một JSON string và trả về string chào mừng.
cat > src/lib.rs String {
// Giả lập xử lý JSON input đơn giản
if input.is_empty() {
return "No input provided".to_string();
}
greet(&input)
}
EOF
Kết quả mong đợi: File `src/lib.rs` được ghi nội dung hàm xử lý.
Biên dịch code Rust thành file .wasm sử dụng `wasm-pack` hoặc `cargo wasm`. Ta dùng `cargo-wasm` để tạo file .wasm hệ thống (System Wasm) thay vì Browser Wasm.
cargo install cargo-wasm
cargo wasm build --release
Kết quả mong đợi: Quá trình biên dịch thành công, tạo ra file `.wasm` trong thư mục `target/wasm32-wasi/release/`. Tên file thường là `wasm_greet.wasm`.
Copy file .wasm ra thư mục chứa artifact để deploy:
cp target/wasm32-wasi/release/wasm_greet.wasm ~/wasm-func/
Kết quả mong đợi: File `wasm_greet.wasm` xuất hiện trong thư mục gốc của project.
3. Triển khai Function Wasm lên OpenFaaS
Bây giờ ta sẽ tạo service trong OpenFaaS để chạy file .wasm đã biên dịch, thay vì build Docker image.
Tại sao: OpenFaaS hỗ trợ mode "native" hoặc thông qua custom provider. Với WasmEdge, ta cần tạo file `stack.yml` để định nghĩa function sử dụng runtime wasm.
Tạo file cấu hình `stack-wasm.yml` để định nghĩa function:
cat > stack-wasm.yml
Kết quả mong đợi: File `stack-wasm.yml` được tạo, khai báo function `greet-wasm` dùng ngôn ngữ `wasm` và chỉ định handler là file .wasm.
Triển khai function lên OpenFaaS bằng lệnh `faas-cli`. Lưu ý cần đảm bảo `faas-cli` đã cấu hình đúng gateway (thường là `http://openfaas.openfaas:8080` nếu chạy trong cluster).
faas-cli deploy -f stack-wasm.yml
Kết quả mong đợi: CLI sẽ upload file .wasm và tạo service. Thông báo "Deployment successful" hoặc tương tự sẽ xuất hiện. Function `greet-wasm` hiện hữu trong danh sách functions.
Verify kết quả bằng cách gọi function:
curl -d 'World' http://openfaas.openfaas:8080/function/greet-wasm
Kết quả mong đợi: Trả về chuỗi `Hello from WasmEdge, World`. Thời gian phản hồi (response time) thường dưới 50ms ngay cả khi là lần gọi đầu tiên (cold start).
4. Triển khai Function Wasm lên Cloudflare Workers
Sang phần Cloudflare, ta sẽ chuyển cùng một logic sang nền tảng Edge Computing. Cloudflare Workers hiện hỗ trợ Wasm thông qua "Wasm Workers" (trước đây là Wasm modules trong Workers).
Tại sao: Cloudflare Workers chạy trên mạng Edge toàn cầu, latency thấp hơn nhiều so với Kubernetes cluster ở một region duy nhất. Wasm trên Cloudflare chạy trực tiếp trên V8 engine, không cần container.
Cài đặt `wrangler` CLI của Cloudflare nếu chưa có:
npm install -g wrangler
wrangler login
Kết quả mong đợi: CLI wrangler được cài đặt và bạn đăng nhập thành công vào tài khoản Cloudflare.
Tạo project Cloudflare Worker mới:
mkdir -p ~/cf-wasm-worker && cd ~/cf-wasm-worker
wrangler init wasm-worker --type wasm
Kết quả mong đợi: Thư mục được tạo với file `wrangler.toml` và cấu trúc cơ bản cho Wasm Worker.
Sửa file `src/index.js` (hoặc `index.ts`) để import và gọi module Wasm. Cloudflare sẽ tự động biên dịch JS này thành module Wasm nếu cần, nhưng ở đây ta sẽ import file .wasm đã có sẵn từ phần Rust.
cat > src/index.js WebAssembly.compile(buf));
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
const name = url.searchParams.get('name') || 'Guest';
// Khởi tạo instance và gọi hàm
const instance = await WebAssembly.instantiate(wasmModule);
const result = instance.exports.greet(name);
return new Response(result, {
headers: { 'Content-Type': 'text/plain' }
});
}
};
EOF
Kết quả mong đợi: File `src/index.js` được cập nhật với logic load và gọi Wasm.
Copy file .wasm từ phần Rust vào thư mục worker:
cp ~/wasm-func/wasm_greet.wasm ./wasm_greet.wasm
Kết quả mong đợi: File .wasm nằm trong thư mục dự án Cloudflare.
Cập nhật file `wrangler.toml` để đảm bảo cấu hình đúng:
cat > wrangler.toml
Kết quả mong đợi: File cấu hình được ghi đè.
Deploy lên Cloudflare Edge:
wrangler deploy
Kết quả mong đợi: Lệnh upload code và file .wasm lên Cloudflare. Xuất hiện URL deployment dạng `https://wasm-worker..workers.dev`.
Verify kết quả bằng cách gọi API:
curl "https://wasm-worker..workers.dev?name=EdgeUser"
Kết quả mong đợi: Trả về `Hello from WasmEdge, EdgeUser`. Thời gian phản hồi thường < 50ms từ mọi nơi trên thế giới.
5. So sánh hiệu năng và thời gian khởi động
Để đánh giá thực tế sự khác biệt giữa Container (Docker) và Wasm, ta sẽ thực hiện benchmark đơn giản đo thời gian Cold Start.
Tại sao cần so sánh: Việc này giúp quyết định khi nào nên dùng Wasm (workload ngắn, cần tốc độ cao) và khi nào dùng Container (cần full OS, library phức tạp).
Thực hiện benchmark trên OpenFaaS (Docker vs Wasm). Giả sử ta đã có function Docker (greet-docker) và function Wasm (greet-wasm).
Lệnh đo thời gian gọi function Docker (cold start):
time curl -s http://openfaas.openfaas:8080/function/greet-docker -d "World"
Kết quả mong đợi: Thời gian thực thi (real) thường từ 200ms đến 500ms do quá trình pull image (nếu chưa có) và khởi động container.
Lệnh đo thời gian gọi function Wasm (cold start):
time curl -s http://openfaas.openfaas:8080/function/greet-wasm -d "World"
Kết quả mong đợi: Thời gian thực thi (real) thường từ 5ms đến 20ms. WasmEdge load module nhanh hơn rất nhiều so với Docker.
Lệnh đo thời gian gọi Cloudflare Workers (Edge):
time curl -s "https://wasm-worker..workers.dev?name=World"
Kết quả mong đợi: Thời gian thực thi (real) thường từ 10ms đến 30ms (bao gồm network latency đến edge node). Không có concept "cold start" nặng nề như Docker vì Wasm module được cache và load cực nhanh trên V8.
Tổng kết dữ liệu để verify:
- Docker Container: ~300ms (Cold start cao, tốn tài nguyên RAM/CPU khi idle).
- WasmEdge on K8s: ~15ms (Cold start thấp, tiêu tốn ít RAM hơn).
- Cloudflare Workers: ~20ms (Cold start thấp nhất, latency mạng phụ thuộc vào vị trí người dùng).
Kết quả mong đợi: Bạn có số liệu thực tế chứng minh Wasm vượt trội về tốc độ khởi động so với Docker trong kiến trúc Serverless.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Serverless và Edge Computing an toàn với OpenFaaS, Cloudflare Workers và Wasm trên hạ tầng Kubernetes
« Phần 4: Xây dựng và triển khai Cloudflare Workers trên Edge
Phần 6: Thiết lập kiến trúc Hybrid: Kết nối Serverless và Edge »