WASI 0.3 chính thức ra mắt: Hỗ trợ Async native cho WebAssembly Components
Phiên bản WASI 0.3.0 đã được chính thức thông qua, đánh dấu bước ngoặt lớn khi tính năng bất đồng bộ (async) trở thành thành phần gốc của WebAssembly Component Model. Bản cập nhật này giúp đơn giản hóa đáng kể chữ ký hàm và cải thiện hiệu suất thông qua việc quản lý vòng lặp sự kiện tập trung. Các công cụ chạy như Wasmtime và các chuỗi công cụ ngôn ngữ lập trình đang bắt đầu triển khai hỗ trợ cho tiêu chuẩn mới này.

Nhóm công tác WASI (WebAssembly System Interface) đã chính thức phê chuẩn phiên bản WASI 0.3.0. Đây là một bước tiến quan trọng, đưa các nguyên hàm bất đồng bộ (async primitives) vào thành phần cốt lõi của WebAssembly Component Model. Với sự ổn định của đặc tả kỹ thuật mới này, các môi trường chạy (runtime) và chuỗi công cụ (toolchain) đang bắt đầu tung ra các bản cập nhật hỗ trợ.
Sự thay đổi lớn nhất trong WASI 0.3 là việc tái cấu trúc dựa trên các nguyên hàm async có sẵn của Component Model. Trước đây, gói wasi:io trong WASI 0.2 phải xử lý các tác vụ như pollables, input-streams và output-streams một cách thủ công. Giờ đây, khái niệm này đã trở thành một phần của Canonical ABI (Giao diện nhị phân ứng dụng chuẩn), giúp các ràng buộc (bindings) được tạo ra một cách tự nhiên và "idiomatic" hơn đối với từng ngôn ngữ lập trình cụ thể.
Mô hình Async ABI mới
Trong WASI 0.2, mỗi thành phần (component) cần quản lý vòng lặp sự kiện (event loop) riêng của mình. Điều này gây ra khó khăn trong việc phối hợp giữa các thành phần, khiến việc kết hợp các API streaming hoặc async trở nên phức tạp.
WASI 0.3 giải quyết vấn đề này bằng cách chuyển quyền quản lý sang máy chủ (host). Máy chủ sẽ điều khiển một vòng lặp sự kiện duy nhất được chia sẻ bởi tất cả các thành phần. Bằng cách thêm stream, future và async như các cấu trúc dựng sẵn (first-class constructs) vào Canonical ABI, hệ thống cho phép chuyển quyền sở hữu qua ranh giới thành phần một cách mượt mà.
Mô hình async này dựa trên hoàn tất (completion-based) thay vì dựa trên sự sẵn sàng (readiness-based), tương tự như các API hiệu năng cao io_uring của Linux hay IOCP của Windows.
Cải tiến hiệu quả và Service Chaining
Một trong những thay đổi đáng chú ý nhất nằm ở giao diện wasi:http. WASI 0.3 giới thiệu hai khái niệm thế giới (worlds): wasi:http/service và wasi:http/middleware. Điều này cho phép thực hiện "service chaining" – một mẫu hình mà các thành phần có thể kết hợp trực tiếp với nhau.
Đối với các vi dịch vụ (microservices) thường xuyên tương tác với nhau, tính năng này giúp giảm thiểu độ trễ đáng kể. Thay vì phải gửi yêu cầu qua mạng (mất hàng mili-giây), runtime có thể chọn cách kết hợp chúng trực tiếp trong cùng một tiến trình, giảm thời gian gọi xuống mức nano-giây (6 cấp độ cải thiện hiệu suất).
Hỗ trợ đa ngôn ngữ
Sức mạnh của Component Model nằm ở khả năng tạo ràng buộc giữa các ngôn ngữ một cách dễ dàng. Với việc hỗ trợ async dựng sẵn, các trình tạo ràng buộc khách (guest binding generators) có thể tận dụng tính năng này.
- Rust: Có thể ánh xạ
async functrực tiếp thànhasync fn, giúp việc triển khai máy chủ HTTP trở nên tự nhiên như viết mã Rust thuần túy. - Go: Hỗ trợ các luồng ảo (goroutines). Runtime có thể chuyển đổi các lệnh gọi có vẻ đồng bộ thành lệnh gọi async, cho phép streaming thông qua các lệnh chặn mà không làm treo toàn bộ chương trình.
- Các ngôn ngữ khác: Python, JavaScript, C# và C cũng đang trong quá trình hoàn thiện hỗ trợ thông qua các stackless coroutines.
Triển khai và Tương lai
Hiện tại, Wasmtime 45 đã chạy bản release candidate mới nhất và Wasmtime 46 sẽ bật tính năng Component Model Async theo mặc định. jco, chuỗi công cụ Component Model cho JavaScript, cũng đã sẵn sàng hỗ trợ tất cả các tính năng của WASI 0.3.
Các nhà phát triển có thể bắt đầu tìm hiểu về WebAssembly Components thông qua "Wasm Component Model book". Đây là bước đi vững chắc để hướng tới Component Model 1.0 trong tương lai, mở ra một chương mới mà ở đó tính async và khả năng kết hợp (composability) trở nên ưu tiên hàng đầu.
