PRODمنصة BaaS الأوروبية السياديةافتح لوحة المعلومات →

الهندسة · 8 دقيقة للقراءة

Wasmtime مقابل Wasmer للإنتاج Edge Functions

Affane Daylami · Fondateur · 25 يونيو 2026

العودة إلى بلوق

يعد Wasmtime وWasmer أكثر أوقات تشغيل WebAssembly استخدامًا لتشغيل التعليمات البرمجية خارج المتصفح، أو على الحافة، أو من جانب الخادم. قررت Aurabase: يتضمن وضع تنفيذ WASM الأصلي لوظائف الحافة الخاصة بها Wasmtime، وليس Wasmer، ويتم التحقق منه مباشرة في Cargo.toml الخاص بالخدمة المعنية.

تم إنشاء هذا النص الإنجليزي تلقائيًا من النص الأصلي الفرنسي ولم تتم مراجعته بعد.
تمت ترجمة هذه الصفحة تلقائيًا. النسخة الإنجليزية موثوقة.

هذا الاختيار ليس تفضيلاً للواجهة. تقارن هذه المقالة بين وقتي التشغيل حول ما تم التحقق منه فعليًا، والحوكمة، والمترجمين، ومعيار WASI، ونموذج الأمان، ثم تقدم تفاصيل تنفيذ Wasmtime الذي تديره Aurabase في الإنتاج، وقياس الوقود، وانقطاع العصر، وحدود الذاكرة، دون توفير رقم بداية باردة غير مُقاس.

الأساسيات

  • Wasmtime: مشروع Bytecode Alliance، مكتوب بلغة Rust، ومترجم إنتاج Cranelift، وترخيص Apache-2.0 مع استثناء LLVM.
  • Wasmer: وقت التشغيل تم تطويره بواسطة Wasmer Inc.، وثلاثة مترجمات قابلة للتبديل (Singlepass، وCranelift، LLVM)، وترخيص MIT.
  • تعلن Aurabase أن wasmtime = { version = "43", features = ["async", "cranelift"] } هي تبعية إنتاج فعلية في aura-functions، وتم التحقق منها في Cargo.toml.
  • يطبق وضع WASM الأصلي بشكل افتراضي حدًا أقصى للذاكرة يبلغ 64 ميجابايت، وميزانية وقود تبلغ مليار وحدة ومهلة مدتها 10 ثوانٍ، وكلها ثلاثة قابلة للتعديل حسب متغير البيئة.
  • يتواجد وضع WASM هذا مع الوضع الافتراضي لوظائف Aurabase Edge (وقت تشغيل Deno): وهو مسار تنفيذ ثانٍ، وليس المسار الافتراضي.
#
السياق

وقتا تشغيل، نفس قاعدة WebAssembly

قام WebAssembly منذ فترة طويلة بتعيين تنسيق وقت التشغيل للمتصفح. لعدة سنوات، تم استخدامه أيضًا لتنفيذ تعليمات برمجية معزولة على جانب الخادم أو على الحافة: رمز ثانوي تم تجميعه مرة واحدة، ويمكن حمله على أي جهاز مضيف، معزولًا افتراضيًا بدون حاوية أو جهاز افتراضي كامل. يحمل Wasmtime وWasmer هذا الامتداد خارج المتصفح، وكلاهما مكتوب بلغة Rust، وكلاهما قادر على تنفيذ نفس الملف .wasm.

Wasmtime هو مشروع يستضيفه Bytecode Alliance، وهي المنظمة التي تدير العديد من مكونات النظام البيئي لخادم WebAssembly، بما في ذلك مترجم Cranelift. تم تطوير Wasmer بواسطة شركة Wasmer، وهي شركة تنشر وقت التشغيل كمصدر مفتوح بينما تقوم بتسويق الخدمات التكميلية من حوله (النشر على الحافة، والأدوات). نموذجان مختلفان للحوكمة، ولا يوجد حكم على جودة الكود الذي ينتجه أحدهما أو الآخر.

يقارن الجزء المتبقي من هذه المقالة أربعة مجالات يمكن التحقق منها، الترخيص والحوكمة، والمترجمين المتاحين، ومعيار WASI ونموذج المكون، ونموذج الأمان، ثم يشرح، مع التعليمات البرمجية الداعمة، سبب تشغيل نواة Rust الخاصة بـ Aurabase Wasmtime في محرك Edge Functions.

#
الحوكمة والترخيص

مؤسسة متعددة البائعين مقابل الناشر التجاري

تم إصدار Wasmtime بموجب ترخيص Apache-2.0 مع استثناء LLVM، وهو ترخيص متساهل شائع في النظام البيئي للمترجم. تتبع إدارتها نموذج Bytecode Alliance: حيث تساهم العديد من المنظمات في المشروع، ولا تمتلكه أي منها بمفردها.

يتم نشر Wasmer بموجب ترخيص معهد ماساتشوستس للتكنولوجيا (MIT)، وهو أكثر تساهلاً على الورق، لكن توجيهه الفني يظل مركزًا في ناشر واحد، شركة Wasmer Inc. وهذا ليس خطأ في حد ذاته: العديد من المشاريع الناجحة مفتوحة المصدر تتبع هذا النموذج. إنه ببساطة ملف تعريف مختلف للمخاطر إذا كانت مؤسستك تقدر الحوكمة الموزعة عبر كيانات متعددة.

#
المجمعين

واجهة خلفية واحدة مقابل ثلاثة: Cranelift، وSinglepass، وLLVM

يتم تجميع Wasmtime في الإنتاج عبر Cranelift، وهو منشئ الأكواد أيضًا من Bytecode Alliance. يوثق الصندوق أيضًا مترجمًا إضافيًا، Winch، مصمم لتقليل وقت الترجمة مقارنةً بـ Cranelift في الحالات الحساسة لبدء التشغيل. Cargo.toml لـوظائف الهالة تقوم فقط بتنشيط ميزة cranelift: هذا المترجم، وهو وحده، هو الذي يعالج كل وحدة WASM تم تحميلها في الإنتاج.

يأخذ واسمر المسار المعاكس: ثلاث واجهات خلفية قابلة للتبديل. يتم تجميع Singlepass في مسار واحد، على الفور تقريبًا، على حساب كود الآلة الأقل تحسينًا. تقدم Cranelift حلاً وسطًا متوازنًا. تهدف LLVM إلى تحقيق أفضل إنتاجية تنفيذ ممكنة، مع أطول وقت تجميع من بين الثلاثة. وقت تشغيل واحد، وثلاثة ملفات تعريف تسوية تم اختيارها أثناء التكوين.

#
المعايير

معاينة WASI 2 ونموذج المكون

تعمل WASI، واجهة نظام WebAssembly، على توحيد الوصول إلى الملفات والساعات والشبكة من وحدة WASM، دون الاعتماد على المتصفح. أحدث إصدار لها، WASI Preview 2، يعتمد على نموذج المكون: آلية لتأليف وحدات مكتوبة بلغات مختلفة، مع واجهات مكتوبة مشتركة بدلاً من تنسيق ثنائي خاص بكل وقت تشغيل. يعمل كل من Wasmtime وWasmer على تنفيذ هذا المعيار، كل حسب سرعته الخاصة.

بالإضافة إلى ذلك، يقوم Wasmer بتوثيق WASIX، وهو امتداد يهدف إلى تغطية عناصر POSIX الأولية التي لا يغطيها معيار WASI الرسمي بعد، مثل الخيوط أو مآخذ الشبكة الأكثر شمولاً. هذا ليس معيارًا مدعومًا من قبل مجموعة عمل WebAssembly، ولكنه امتداد خاص بنظام Wasmer البيئي.

ما الذي لا يستخدمه وضع Aurabase WASM

وضع wasm الأصلي لـ Aurabase، والذي تم التحقق منه في wasm/mod.rs، لا يستخدم حاليًا WASI Preview 2 ولا نموذج المكون. هذا هو الحد الأدنى من ABI للمضيف المحلي، وأربع وظائف مكشوفة لوحدة الضيف، وليس المعيار الكامل. لا يقوم Cargo.toml أيضًا بتنشيط ميزة wasi على الصندوق wasmtime.

#
الأمن

عزل الذاكرة وتوقيتها: الوقود، العصر، الحدود

يعمل كلا وقتي التشغيل على عزل كل وحدة في ذاكرتها الخطية الخاصة، مع عدم وجود وصول مباشر إلى النظام المضيف خارج الوظائف المستوردة بشكل صريح. هذا هو أساس نموذج الأمان WebAssembly، المشترك بين كلا المشروعين.

يكشف Wasmtime أيضًا عن واجهة برمجة تطبيقات لقطات التنفيذ الأصلية، fuel: تستهلك كل تعليمات ميزانية محددة مسبقًا، ويتوقف التنفيذ بشكل صحيح بمجرد استنفاد هذه الميزانية. تسمح لك واجهة برمجة التطبيقات الثانية، وهي مقاطعة epoch، بفرض مهلة دون حظر المحرك أثناء الانتظار. يوثق واسمر آليات القياس الخاصة به وحدود الذاكرة لكل حالة؛ لم تقم هذه المقالة بالتحقق منها في مستودع جهة خارجية، لذلك لا تقوم بتقسيمها رقمًا تلو الآخر.

هذا هو بالضبط ما تتيحه خدمة aura-functions الخاصة بـ Aurabase، وهو ما سيتم تفصيله في القسم التالي مع كود المصدر الفعلي.

#
خيار أوراباسي

تم التحقق من رمز Wasmtime، وليس تفضيلًا معلنًا

تعلن خدمة aura-functions عن wasmtime باعتبارها تبعية إنتاج، بدون تعليقات إلغاء التنشيط أو تكوين تبعية التطوير. لا يوجد ملف في المستودع، لا ملف Cargo.toml ولا ملف .rs، يذكر Wasmer.

Cargo.tomltoml
# وقت تشغيل WASM
wasmtime = { version = "43", features = ["async", "cranelift"] }

يقوم رمز التهيئة بشكل صريح بتنشيط الوقود والمقاطعة حسب العصر، ثم يحد الذاكرة عن طريق الاستدعاء باستخدام StoreLimits:

wasm/mod.rsrust
let mut cfg = Config::new();
cfg.consume_fuel(true);
cfg.epoch_interruption(true);
let engine = Engine::new(&cfg)?;

// عن طريق الدعوة:
let limits = StoreLimitsBuilder::new()
    .memory_size(self.max_memory_mb as usize * 1024 * 1024)
    .build();
store.set_fuel(self.max_fuel)?;
store.epoch_deadline_async_yield_and_update(1);

جميع الحدود الثلاثة قابلة للتكوين لكل متغير بيئة، مع تحديد القيم الافتراضية في config/mod.rs: WASM_MAX_MEMORY_MB عند 64، WASM_TIMEOUT_SECS عند 10، WASM_MAX_FUEL عند مليار وحدة. يتم تشغيل المهلة في الخلفية: ينتظر tokio::spawn المدة التي تم تكوينها ثم يزيد عصر المحرك، دون حظر التنفيذ الحالي أثناء الانتظار.

تظل واجهة ABI المعرضة لوحدات الضيف في حدها الأدنى عمدًا: أربع وظائف مضيفة، aura.logو aura.get_inputو aura.set_output و aura.get_env، مسجلة عبر linker.func_wrap. إنه ليس نموذج المكون، ولا WASI Preview 2: إنه عقد داخلي، أضيق، مصمم للاستخدام الفردي، تنفيذ وظيفة حافة HTTP واستعادة استجابة JSON الخاصة به.

يعد وضع wasm هذا اختيارًا لكل وظيفة، وليس تبديلًا عامًا. نظرة عامة على بنية Aurabase توضح تفاصيل المسار الآخر، الوضع الافتراضي deno، الذي ينفذ JavaScript/TypeScript في خدمة منفصلة. كلاهما يتواجدان في نفس خدمة aura-functions.

تم التحقق منه مقابل هدف المنتج

ما تم التحقق منه هنا هو تطبيق Wasmtime الفعلي وحدود موارده الافتراضية. لم يتم ذكر أرقام البداية الباردة: راجع تحليلنا المخصص للبداية الباردة لـ WebAssembly للتعرف على ما يمكن قياسه وما لم يتم قياسه بعد.

#
نظرة عامة

واسمتايم وفاسمر، جنبًا إلى جنب

الحكمتحالف Bytecode، متعدد المنظماتشركة Wasmer، ناشر تجاري
الترخيصأباتشي-2.0 مع استثناء LLVMمعهد ماساتشوستس للتكنولوجيا
لغة التنفيذالصدأالصدأ
المجمعينرافعة الرافعة (الرافعة اختيارية، غير مفعلة في Aurabase)Singlepass، Cranelift، LLVM من اختيارك
معيار واسيWASI Preview 2 + نموذج المكونWASI Preview 2 + WASIX (امتداد خاص بـ Wasmer)
لقطات الجريالوقود + المقاطعة حسب العصر (واجهة برمجة التطبيقات الأصلية التي تم التحقق منها)الآليات الخاصة بـ Wasmer، لم يتم التحقق منها هنا
تستخدم من قبل Aurabaseنعم، وظائف الهالة، الإصدار 43 مثبتلا، لا تبعية، مباشرة أو متعدية

المصادر: Cargo.toml وwasm/mod.rs من مستودع Aurabase، تم التحقق منها مباشرة في 24 أغسطس 2026. خصائص Wasmtime وWasmer العامة مأخوذة من الوثائق العامة لكل مشروع؛ لا يتم إعادة نشر أي أرقام مرجعية لطرف ثالث في هذا الجدول.

#
القرار

من يجب أن يختار ماذا

تبدأ فترة تشغيل جديدة، بدون أي تبعيات موجودة. Wasmtime، بدعم من مؤسسة متعددة البائعين، يقلل من مخاطر الاعتماد على ناشر واحد لمستقبل المشروع.

لديك نوبات برد متكررة جدًا وقصيرة الأمد. تستجيب الواجهة الخلفية Singlepass الخاصة بـ Wasmer بشكل مباشر لهذه الحاجة، وتجميع فوري تقريبًا، على حساب كود الآلة الأقل تحسينًا.

أنت بحاجة إلى عناصر POSIX الأولية التي تتجاوز معيار WASI الحالي. WASIX، امتداد Wasmer، يغطي الخيوط والمآخذ الممتدة التي لم تغطيها WASI Preview 2 وحدها بعد.

أنت تريد واجهة برمجة تطبيقات أصلية للقطات والمهلة، بدون برامج وسيطة تابعة لجهات خارجية. يكشف Wasmtime fuel وepoch مباشرة في الصندوق، وهو بالضبط ما يتيحه aura-functions في Aurabase.

#
الأسئلة المتداولة

الأسئلة الشائعة

هل Wasmtime أسرع من Wasmer؟+
لم يتم ذكر أرقام الأداء المقارنة هنا طوعا. يكشف وقتا التشغيل عن مترجمين مختلفين (Cranelift لـ Wasmtime؛ واختيار Singlepass أو Cranelift أو LLVM لـ Wasmer)، والتي تستجيب لمقايضات متميزة بين سرعة الترجمة وسرعة التنفيذ. اطلع على تحليلنا المخصص لبداية WebAssembly الباردة للمعالجة المشفرة والمصادر.
هل يمكننا استخدام Wasmtime وWasmer في نفس المشروع؟+
نعم من الناحية الفنية، حيث أن كلاهما يستخدم نفس تنسيق .wasm. ولكن هذا يضاعف مساحة سطح التكامل، وواجهتي برمجة التطبيقات المضيفتين، ونموذجي التكوين، دون أي فائدة صافية لمعظم الفرق. تقوم Aurabase بشحن واحدة فقط، ويتم التحقق منها في Cargo.toml الخاص بخدمة وظائف الهالة.
هل تعمل جميع وظائف Aurabase Edge على Wasmtime؟+
لا. يقوم الوضع الافتراضي لوظائف Aurabase Edge بتشغيل JavaScript/TypeScript من خلال خدمة Deno منفصلة. وضع Wasm، المدعوم من Wasmtime، هو مسار تنفيذ ثانٍ، يتم اختياره على أساس كل وظيفة على حدة، وليس المسار الافتراضي.
ما الذي يوفره نموذج مكون WebAssembly بالفعل؟+
يقوم نموذج المكون بتوحيد تكوين وحدات WASM المكتوبة بلغات مختلفة، مع واجهات مكتوبة مشتركة، دون الاعتماد على تنسيق ثنائي خاص بوقت التشغيل. لا يستخدمه وضع WASM الأصلي لـ Aurabase اليوم: فهو عبارة عن مضيف ABI بسيط محلي الصنع، وليس نموذج المكون.

هل أنت جاهز للنشر؟

الواجهة الخلفية الخاصة بك في خمس دقائق.

لا حاجة لبطاقة ائتمان · 500 ميجابايت مجانًا · 50000 MAU