انتقل إلى المحتوى الرئيسي
DevOpsMar 28, 2026

WASI 0.3 ونهاية البدء البارد: Wasm من جانب الخادم في الإنتاج

OS
Open Soft Team

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، يدعم التطبيقات متعددة المكونات في الإنتاج.

الأداء: بدء بارد بالميكروثانية مقابل ثوان الحاويات

المقياسحاوية DockerAWS Lambdaوحدة Wasm (Spin)وحدة Wasm (Wasmtime)
البدء البارد500ms - 5s100ms - 2s0.5ms - 3ms0.3ms - 2ms
الاستدعاء الدافئ1ms - 50ms1ms - 20ms0.1ms - 1ms0.05ms - 0.5ms
بصمة الذاكرة50MB - 500MB128MB - 10GB1MB - 20MB1MB - 15MB
حجم الملف الثنائي50MB - 2GBN/A (حزمة zip)1MB - 30MB1MB - 30MB
تكلفة البدءOS + وقت التشغيل + التطبيقوقت التشغيل + التطبيقإنشاء مثيل الوحدةإنشاء مثيل الوحدة
العزلLinux namespaces + cgroupsFirecracker 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 - 5s0.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 افتراضي قائم على القدرات
الوصول إلى GPUNVIDIA Container Toolkitتجريبي (wasi-nn)
نضج النظام البيئي12+ سنة، نظام بيئي ضخم3 سنوات، نمو سريع
التنسيقKubernetes, ECS, NomadSpinKube, 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 أسابيع للوصول إلى الإنتاجية.

الوسوم