WASI 0.3 ونهاية البدء البارد: Wasm من جانب الخادم في الإنتاج
Engineering Team
WASI 0.3 وصل — وهذا يغير كل شيء
صدر WebAssembly System Interface (WASI) 0.3 في فبراير 2026، وهو يسد الفجوة الأخيرة التي منعت Wasm من جانب الخادم من دخول أحمال العمل الإنتاجية السائدة. مع async I/O أصلي، وأنواع stream من الدرجة الأولى، ودعم كامل لمقابس TCP/UDP، يمكن لوحدات Wasm الآن القيام بكل ما يمكن للحاوية القيام به — بجزء بسيط من تكلفة البدء.
إذا كنت قد رفضت Wasm على الخادم باعتباره لعبة، فهذا الإصدار هو إشارتك لإعادة النظر. أطلقت AWS وGoogle Cloud وAzure جميعها بيئات تشغيل Wasm بدون خادم في 2025-2026، وشركات مثل Fermyon وFastly وCloudflare تشغل Wasm في الإنتاج على نطاق واسع منذ أكثر من عامين.
ما الذي يقدمه WASI 0.3 فعلياً
قدم WASI 0.2 (يناير 2024) Component Model وواجهات I/O أساسية. يبني WASI 0.3 على هذا الأساس بثلاث إضافات حاسمة:
Async I/O أصلي
قدم WASI 0.2 فقط I/O محجوب. إذا كانت وحدة Wasm تحتاج للتعامل مع اتصالات متعددة متزامنة، كنت عالقاً مع الخيوط أو حلقات الاستطلاع المرهقة. يقدم WASI 0.3 نموذجاً غير متزامن أصلياً يرتبط مباشرة بالأوليات غير المتزامنة على مستوى اللغة:
- Rust:
async fnمعtokioأوasync-stdيتم تجميعه أصلياً إلى WASI 0.3 غير متزامن - Go: تُعيَّن Goroutines إلى مهام WASI غير متزامنة
- Python: حلقة أحداث
asyncioتتكامل مع مجدول WASI - JavaScript:
Promiseوasync/awaitيعملان مباشرة عبر JCO
تدير بيئة التشغيل (Wasmtime أو WasmEdge أو Spin) حلقة الأحداث. يكتب كودك غير متزامن اصطلاحي بأي لغة تختارها، وطبقة WASI تتعامل مع الباقي.
// معالج HTTP غير متزامن بلغة Rust مجمع إلى WASI 0.3
use wasi::http::types::{IncomingRequest, ResponseOutparam};
async fn handle_request(req: IncomingRequest, resp: ResponseOutparam) {
// قراءة جسم الطلب بشكل غير متزامن
let body = req.consume().await.unwrap();
let bytes = body.read_all().await.unwrap();
// إجراء استدعاء HTTP صادر (غير محجوب)
let api_response = wasi::http::outgoing_handler::handle(
build_api_request(&bytes)
).await.unwrap();
// بث الاستجابة
let out = resp.set(200, &headers);
out.body().write_all(&api_response.body()).await.unwrap();
}
أنواع Stream
يقدم WASI 0.3 stream<T> وfuture<T> كأنواع من الدرجة الأولى في نظام أنواع Component Model. هذا يعني أن المكونات يمكنها تمرير بيانات البث عبر حدود اللغات بدون تسلسل:
// تعريف واجهة WIT مع أنواع stream
interface data-processor {
process: func(input: stream<list<u8>>) -> stream<record>;
record record {
id: u64,
payload: list<u8>,
timestamp: u64,
}
}
هذا يتيح خطوط أنابيب بث حقيقية حيث يغذي محلل بيانات Rust نموذج ML بلغة Python الذي يغذي مسلسل Go — كلها تعمل في نفس العملية عبر تدفقات نسخ صفري.
دعم كامل للمقابس
يوفر WASI 0.3 واجهات برمجة تطبيقات كاملة لمقابس TCP وUDP:
tcp::listenوtcp::connectلمقابس الخادم والعميلudp::bindوudp::send_to/udp::recv_fromلبروتوكولات مخطط البيانات- إنهاء TLS عبر
wasi:sockets/tls - تحليل DNS عبر
wasi:sockets/name-lookup
Component Model: التكوين متعدد اللغات
Component Model، الذي استقر في WASI 0.2 وصُقل في 0.3، هو ما يجعل Wasm من جانب الخادم مختلفاً جوهرياً عن الحاويات. يسمح لك بتكوين مكونات Wasm متعددة — مكتوبة بلغات مختلفة — في تطبيق واحد:
+------------------+ +-------------------+ +------------------+
| Auth Component |---->| Business Logic |---->| Data Layer |
| (Rust) | | (Python) | | (Go) |
+------------------+ +-------------------+ +------------------+
| | |
wasi:http wasi:keyvalue wasi:sql
capability capability capability
كل مكون:
- يعمل في صندوق رمل خاص به مع أمان قائم على القدرات (بدون سلطة محيطة)
- يعلن عن واجهات النظام التي يحتاجها عبر WIT
- يتواصل مع المكونات الأخرى عبر واجهات مكتوبة النوع، وليس JSON مسلسل
- يمكن تحديثه بشكل مستقل بدون إعادة نشر التطبيق بالكامل
Fermyon Spin 3.0، الذي صدر في يناير 2026، يدعم التطبيقات متعددة المكونات في الإنتاج.
الأداء: بدء بارد بالميكروثانية مقابل ثوان الحاويات
| المقياس | حاوية Docker | AWS Lambda | وحدة Wasm (Spin) | وحدة Wasm (Wasmtime) |
|---|---|---|---|---|
| البدء البارد | 500ms - 5s | 100ms - 2s | 0.5ms - 3ms | 0.3ms - 2ms |
| الاستدعاء الدافئ | 1ms - 50ms | 1ms - 20ms | 0.1ms - 1ms | 0.05ms - 0.5ms |
| بصمة الذاكرة | 50MB - 500MB | 128MB - 10GB | 1MB - 20MB | 1MB - 15MB |
| حجم الملف الثنائي | 50MB - 2GB | N/A (حزمة zip) | 1MB - 30MB | 1MB - 30MB |
| تكلفة البدء | OS + وقت التشغيل + التطبيق | وقت التشغيل + التطبيق | إنشاء مثيل الوحدة | إنشاء مثيل الوحدة |
| العزل | Linux namespaces + cgroups | Firecracker microVM | صندوق رمل Wasm | صندوق رمل Wasm |
الفرق ليس تدريجياً — إنه ثلاثة مراتب من الحجم.
لماذا بهذه السرعة؟
وحدات Wasm تتخطى تسلسل إقلاع نظام التشغيل بالكامل. لا تهيئة للنواة، لا تركيب لنظام الملفات، لا تحميل للمكتبات الديناميكية. قدم Wasmtime 19 (مارس 2026) تخصيص المثيلات المجمعة — يصبح إنشاء مثيل وحدة Wasm جديدة إزاحة مؤشر واحدة بالنانوثانية.
مشهد مزودي السحابة
AWS Lambda Wasm Runtime (GA ديسمبر 2025)
- دعم WASI 0.3 عبر Wasmtime
- بدء بارد دون الملي ثانية
- دعم Component Model للوظائف متعددة اللغات
- أرخص بنسبة 50% من Lambda الحاوية المكافئة
Google Cloud Run Wasm (GA فبراير 2026)
- نشر مكونات
.wasmمباشرة عبرgcloud run deploy --wasm - تحجيم تلقائي إلى الصفر مع بدء بارد بالميكروثانية
- دعم gRPC وHTTP/2 عبر مقابس WASI
Azure Container Apps Wasm (معاينة، GA الربع الثاني 2026)
- أصلي لـ Kubernetes: أحمال Wasm تعمل بجانب الحاويات
- Spin Operator يدير دورة حياة مكونات Wasm
- تحجيم تلقائي قائم على KEDA
سير عمل تطوير Rust + Wasm
# تثبيت هدف WASI
rustup target add wasm32-wasip2
# إنشاء مشروع جديد
cargo init --name my-service
# إضافة تبعيات WASI
cargo add wit-bindgen
cargo add wasi --features "http,keyvalue,sql"
# بناء مكون Wasm
cargo build --target wasm32-wasip2 --release
# تشغيل محلياً مع Wasmtime
wasmtime serve target/wasm32-wasip2/release/my_service.wasm
الحاويات مقابل وحدات Wasm: مقارنة كاملة
| البعد | حاويات (Docker/OCI) | وحدات Wasm (WASI 0.3) |
|---|---|---|
| البدء البارد | 500ms - 5s | 0.3ms - 3ms |
| تكلفة الذاكرة | 50MB - 500MB أساسي | 1MB - 20MB أساسي |
| حجم الملف الثنائي | 50MB - 2GB صور | 1MB - 30MB مكونات |
| نموذج العزل | Linux namespaces + cgroups | صندوق رمل Wasm (آمن للذاكرة بالتصميم) |
| دعم اللغات | جميعها (ثنائيات أصلية) | Rust, Go, Python, JS, C/C++, C#, Kotlin |
| الشبكة | مكدس شبكة OS كامل | مقابس WASI (TCP, UDP, TLS) |
| نظام الملفات | نظام ملفات POSIX كامل | FS افتراضي قائم على القدرات |
| الوصول إلى GPU | NVIDIA Container Toolkit | تجريبي (wasi-nn) |
| نضج النظام البيئي | 12+ سنة، نظام بيئي ضخم | 3 سنوات، نمو سريع |
| التنسيق | Kubernetes, ECS, Nomad | SpinKube, wasmCloud, Kubernetes (عبر shim) |
متى تستخدم Wasm
- الوظائف بدون خادم — عندما تكون زمن انتقال البدء البارد مهمة
- الحوسبة الطرفية — عندما يكون حجم الملف الثنائي والذاكرة مقيدين
- أنظمة الإضافات — عندما تحتاج لتنفيذ آمن لكود طرف ثالث
- المنصات متعددة المستأجرين — عندما تكون كثافة العزل مهمة
متى تبقى مع الحاويات
- أحمال GPU (تدريب/استدلال ML) — دعم GPU في WASI لا يزال تجريبياً
- التطبيقات القديمة المعتمدة على ميزات OS محددة
- الخدمات ذات الحالة التي تحتاج تخزيناً محلياً دائماً
دراسات حالة إنتاجية
Shopify: تجارة على الحافة
نقلت Shopify عرض واجهات متاجرها إلى Wasm على الحافة في 2025، معالجة 2.3 مليون طلب في الثانية عبر Cloudflare Workers. النتيجة: تخفيض 68% في TTFB للعملاء العالميين.
Midokura (Sony): بوابة IoT
تستخدم شركة Sony التابعة Midokura Wasm لتشغيل معالجات بروتوكولات الأجهزة على بوابات IoT بذاكرة 256MB. مع Wasm، يشغلون 40 معالج بروتوكول في مساحة الذاكرة التي كانت تدعم 4 حاويات فقط.
منصة Fermyon: SaaS متعدد المستأجرين
تشغل منصة Fermyon السحابية أحمال العملاء كمكونات Wasm مع 12,000 مثيل لكل عقدة. بدء بارد متوسط 0.8ms، وتكلفة لكل طلب أقل بـ 10 مرات من وظائف Lambda المكافئة.
نموذج الأمان
- الرفض افتراضياً — وحدة Wasm لا يمكنها الوصول إلى أي شيء ما لم يمنح المضيف القدرات صراحة
- أمان الذاكرة — الذاكرة الخطية تمنع تجاوزات المخزن المؤقت من الهروب من صندوق الرمل
- بدون سلطة محيطة — على عكس الحاويات، يجب منح كل قدرة بشكل فردي
- التحقق الرسمي — مواصفات Wasm بسيطة بما يكفي لأدوات التحقق الرسمي
الأسئلة الشائعة
هل WASI 0.3 جاهز للإنتاج؟
نعم. WASI 0.3 هو أول إصدار تعتبره Bytecode Alliance جاهزاً للإنتاج لأحمال الخادم.
هل يمكن لـ Wasm استبدال Kubernetes؟
ليس بالكامل. يستبدل Wasm وقت تشغيل الحاوية للأحمال المناسبة، لكن التنسيق لا يزال ضرورياً.
ماذا عن برامج تشغيل قواعد البيانات؟
دعم المقابس الكامل في WASI 0.3 يعني أن برامج تشغيل قواعد البيانات الأصلية تعمل. واجهة wasi:sql توفر API SQL موحدة.
كيف يتعامل WASI 0.3 مع الحالة؟
وحدات Wasm بدون حالة افتراضياً. للحالة، استخدم wasi:keyvalue أو wasi:sql أو خدمات خارجية عبر مقابس WASI.
ما هو منحنى التعلم لـ Rust + Wasm؟
إذا كنت تعرف Rust بالفعل، فالتعلم الإضافي ضئيل. إذا كان Rust جديداً عليك، توقع 2-4 أسابيع للوصول إلى الإنتاجية.