هذا هو الغوص العميق الطويل. للحصول على نسخة أسرع وقابلة للقراءة، راجع مشاركة مدونة مصاحبة.

1. المقدمة: مكدسات العادة مقابل أعباء العمل الحقيقية
نادراً ما تفشل خيارات التكنولوجيا في المؤسسات الناضجة لأنه لا أحد يقرأ منشور مدونة مرجعي. إنهم يفشلون لأن عملية لأن الاختيار ضعيف: تفضيل كبير للمهندسين، أو خط توظيف مليء بلغة واحدة، أو عرض توضيحي واحد مثير للإعجاب في مؤتمر. وفي الوقت نفسه، يمزج المنتج بين APIs الحساسة لزمن الاستجابة، وتسوية الدُفعات، ومصادقة الحافة في NGINX، وCLIs الداخلية، والارتفاع العرضي بدون خادم. لا يمكن أن يكون وقت تشغيل واحد هو الأمثل لجميع هذه الأشكال.
يشرح هذا المقال مقاييس متعدد اللغات - لوحة تحكم للمقارنة المباشرة والمفتوحة أمثلة/معايير سير العمل تسخير وراء ذلك - كما أ إطار القرار، وليس لوحة المتصدرين fanboy. الهدف هو دليل يمكنك إرفاقه بسجل قرار البنية (ADR): نفس نقاط النهاية، نفس مولد التحميل، نفس تخطيط الحاوية، لغات متعددة.
لن أخترع أرقام الإنتاجية في النثر. عند تشغيل مجموعة الأدوات، تعرض لوحة المعلومات المتطلبات/المتطلبات المُقاسة والنسب المئوية لزمن الوصول لهذا الجهاز وإعداد Docker. تعامل مع أي تصنيف ثابت هنا على أنه أنماط نوعية تتماشى مع مجموعات اختبار الحزام ونسخة الحكم المضمنة في لوحة القيادة.
2. ما هي مقاييس متعدد اللغات؟
مقاييس متعدد اللغات يتم استضافته في polyglot-benchmarks.fictionally.org (البنية التحتية ذات العلامات التجارية الخيالية في النظام البيئي لأمثلة سير العمل). يقارن عنوان الهبوط:
- إنجينكس إن جي إس - وحدات جافا سكريبت داخل المخزون NGINX
- افتح ريستي لوا — لوا على حافة OpenResty
- بايثون FastAPI — تطبيق Uvicorn ASGI
- الذهاب صافي/http — خادم المكتبة القياسي
- الصدأ Actix-web - HTTP غير المتزامن على Actix
- كعكة - وقت تشغيل JavaScript مع خادم HTTP الأصلي
- جافا (Javalin / Jetty) — JVM HTTP خفيف الوزن على Jetty
- Kotlin (Ktor / Netty) - JVM HTTP الصديق للبيئة على Netty
العنوان المباشر هو 8-لغة مقارنة: njs vs Lua vs Python vs Go vs Rust vs Bun vs Java vs Kotlin. يحدد العنوان الفرعي القصد: الأداء لـ أعباء عمل الاقتراع/الدردشة/قائمة الانتظار/API الطويلة - مسارات كثيفة الاتصال، وثقيلة JSON، وثقيلة التوجيه بدلاً من سباق عربات "مرحبًا بالعالم" واحد. أخيرًا حصلت متاجر JVM على نفس السطح العادل مثل Go/Rust/Bun بدلاً من حكاية "المؤسسة" المنفصلة.
2.1 ما تظهره لوحة القيادة
أثناء تقدم التشغيل، تقوم واجهة المستخدم بالاستقصاء /data/results.json كل ثانيتين ويظهر:
- الطلبات في الثانية (الإنتاجية) - مجمعة من
wrkلكل لغة لكل اختبار - متوسط الكمون و P99 الكمون الذيل - بالمللي ثانية من نموذج زمن الوصول الخاص بـ Wrk
- TTFB (الوقت حتى البايت الأول) - من توقيت الضفيرة JSON إلى جانب wrk
- جدول ملخص — الفائزون في كل اختبار مع علامات ★ على أفضل الخلايا
- بطاقات الاختبار التفصيلية — المخططات الشريطية والجداول المترية (P50، P90، P99.9، الأخطاء)
- التوزيع المئوي للكمون - المتوسط عبر الاختبارات
- الحكم - الأفضل لحالة الاستخدام الخاصة بك - السرد بمجرد الحالة
complete
تم تصميم هذا الهيكل بشكل متعمد لـ ARB: مخططات للشرائح، وجداول لجداول البيانات، وسرد لقسم المخاطر في ADR.
3. تسخير أمثلة سير العمل
كل شيء قابل للتكرار يعيش تحته benchmarks/ في أمثلة سير العمل مستودع. تخطيط المستوى الأعلى:
benchmarks/
bench.sh # orchestrates tests, writes results.json
wrk_json.lua # wrk done() → JSON summary (RPS, percentiles)
docker-compose.yml # eight app services + dashboard + bench runner
njs/ # NGINX + njs module
lua/ # OpenResty nginx.conf
python/ # FastAPI + Dockerfile
golang/ # net/http main.go
rust/ # Actix-web + Cargo
bun/ # Bun server.ts
java/ # Javalin on Jetty
kotlin/ # Ktor on Netty
dashboard/ # static index.html + nginx.conf
3.1 طوبولوجيا Docker Compose
docker-compose.yml يحدد الخدمات المعزولة على شبكة مشتركة:
nginx-njs— المنفذ 8081، التكوينات من./njsopenresty-lua- المنفذ 8082python-fastapi— المنفذ 8084، مبني من./pythongo-server— المنفذ 8085rust-actix- المنفذ 8086bun-server- المنفذ 8087java-server- المنفذ 8088، Javalin / Jetty من./javakotlin-server- المنفذ 8089، Ktor / Netty من./kotlindashboard— المنفذ 8083، يخدم HTML ويقوم بتثبيتresultsحجم في/databench- حاوية جبال الألب التي يتم تثبيتهاcurl,wrk,jq، ينتظر التبعيات، ويعملbench.sh
عداء مقاعد البدلاء يشارك في results الحجم باستخدام لوحة المعلومات حتى تظهر النتائج مباشرة بدون نسخ يدوي.
3.2 منهجية bench.sh
يقوم برنامج تشغيل Shell بتشفير قواعد العدالة بشكل صريح:
- مدة:
10sلكل نقطة نهاية لكل لغة - المواضيع: 4
- اتصالات: 100 المتزامنة
- تسخين: ضرب 50 طلقة
/helloعلى كل خادم قبل الاختبارات المحددة بوقت - لكل خادم: توقيت الضفيرة JSON (DNS، Connect، ttfb، Total) بالإضافة إلى WRK مع
wrk_json.lua
يتم تحديد سبعة اختبارات في البرنامج النصي:
| بطاقة تعريف | اسم | نية | نقطة النهاية |
|---|---|---|---|
| 1 | نص عادي | خط الأساس - الحد الأدنى من الاستجابة، وإطار العمل العام | /hello |
| 2 | تسلسل JSON | بناء وتسلسل مجموعة JSON المكونة من 100 عنصر | /json |
| 3 | CPU-منضم (ليف 30) | فيبوناتشي العودية (30) - CPU النقي | /cpu?n=30 |
| 4 | التلاعب بالسلسلة | قم ببناء وتقسيم وأحرف كبيرة وإعادة ضم 1000 قطعة | /string |
| 5 | طلب التفتيش | الرؤوس والطريقة والوسائط → JSON | /request_info?foo=bar&baz=123 |
| 6 | طلب فرعي + تحويل | الطلب الفرعي الداخلي، تحليل JSON، التحويل | /subrequest |
| 7 | منطق التوجيه | التوجيه الشرطي على معلمات الاستعلام | /route?action=greet&name=bench |
تطبق كل لغة نفس سطح المسار (انظر golang/main.go, python/main.py, java/, kotlin/، وتكوينات NGINX، وما إلى ذلك) لذا فإن الاختلافات تعكس وقت التشغيل وإطار العمل، وليس المواصفات غير المتطابقة.
4. لماذا يهم "متعدد اللغات" (بدون تعصب)
الهندسة المعمارية متعددة اللغات لا تعني أن كل مهندس يتعلم ثماني لغات. يعني سياقات محدودة احصل على وقت تشغيل يناسب:
- طائرة الحافة — المصادقة، حدود المعدل، التوجيه: Lua أو njs داخل NGINX الذي تعمل عليه بالفعل
- الطائرة الأساسية API - منطق العمل مع SLOs: Go أو Rust
- طائرة جي في إم - عقارات الربيع/جاكرتا الحالية، والمكتبات المشتركة، وعمق التوظيف: Java (Javalin) أو Kotlin (Ktor)
- طائرة البيانات — ETL، دفاتر الملاحظات، ML الغراء: بايثون
- في الوقت الحقيقي طائرة JS - WebSockets، الأنواع المشتركة مع الواجهة الأمامية: Bun أو Node حيث تفوز السرعة
تعمل الأكوام الموحدة على تحسين الموارد البشرية والمشتريات. تحسين معايير متعدد اللغات تناسب عبء العمل مع مقايضات قابلة للقياس على الطاولة.
5. الأبعاد المهمة
المتطلبات الأولية هي المقياس الذي ينتقل بشكل أسرع على Slack. كما أنه من الأسهل إساءة القراءة. استخدم نموذج تقييم متعدد الأعمدة:
| معيار | يهيمن عندما… | إشارة تسخير |
|---|---|---|
| الكمون p50 / p99 | APIs التي تواجه المستخدم، والدردشة، واستطلاع طويل | نسب زمن الوصول للعمل؛ لوحة القيادة P99 الرسم البياني |
| الإنتاجية (RPS) | بوابات مروحية عالية ومجمعات الدفعات | العمل RPS؛ عمود ملخص الفائز |
| الذاكرة لكل اتصال | الآلاف من WebSockets الخاملة | التنميط النوعي + الإنتاج (غير مكتمل بالكامل) |
| TTFB | ملكة جمال CDN، والمسارات الباردة، وشبكات الهاتف المحمول | حليقة time_starttransfer في النتائج JSON |
| LOC / التعقيد | الشركات الناشئة، التحكم في التغيير المنظم | مقارنة التطبيقات عبر المجلدات |
| وقت البناء وCI | عمليات النشر المتكررة، والعديد من الخدمات | يقوم Docker ببناء ملفات تعريف لكل لغة |
| عبء العمليات | فريق منصة صغيرة | مهارات NGINX الحالية → Lua/njs؛ حاويات أخرى |
| تكلفة الاستضافة | التشغيل دائمًا مقابل المقياس إلى الصفر | مشتق من الذاكرة + CPU تحت التحميل (الإنتاج) |
6. مصفوفة القرار
الرسم البياني أدناه هو الخريطة النوعية التي نستخدمها في المراجعات - القادة التوضيحيين، وليس بديلاً لتشغيل الحزام على مجموعتك.

اقرأه في الصف الأول: اختر شكل عبء العمل، ثم أعمدة الوزن. إذا تعارض معياران (على سبيل المثال، أفضل RPS مقابل أدنى LOC)، فإن هذا التوتر هو مناقشة ADR التي تستحق إجراءها.
7. أنماط الحالات (مثال على وضع العلامات)
الخرائط التالية تسخر عائلات الاختبار للخيارات المعمارية. تظهر العلامات الرائدة على جهازك على لوحة المعلومات بعد التشغيل — لا تعامل هذا القسم على أنه نتائج ثابتة.
7.1 API حساس لزمن الاستجابة (الاختبارات 1-2، 5-7)
تعكس JSON APIs ومعالجات التوجيه الثقيلة الاختبارات 2 و5 و7. عادةً ما تؤدي أوقات التشغيل غير المتزامنة المجمعة (Rust Actix، Go) إلى الإنتاجية وزمن الوصول الذيل في هذه الفئة من معايير HTTP الاصطناعية؛ غالبًا ما يكون Bun قريبًا من المسارات الثقيلة لـ JSON مع بيئة عمل JS. جافا (Javalin) و زبر1X (Ktor) امنح فرق JVM قراءة عادلة ضد هؤلاء القادة على نفس المسارات - وهو أمر مفيد عندما يكون السؤال هو "البقاء في JVM بمكدس أخف" مقابل "إعادة الكتابة في Go/Rust". تقوم Python FastAPI بتداول RPS الخام مقابل سرعة التطوير - ويوضح حكم لوحة المعلومات ذلك بوضوح.
7.2 العمل الصغير المرتبط بـ CPU (الاختبار 3)
يعزل فيبوناتشي (30) CPU بدون الإدخال/الإخراج. توقع الصدأ وانطلق للتألق؛ الأكوام المفسرة تدفع النفقات العامة؛ يمكن أن يبدو JVM JIT أقوى بعد عملية الإحماء مما توحي به نافذة 10s الباردة - قم بتمديد المدة إذا كان هذا هو ملفك الشخصي الحقيقي. إذا كانت خدمتك الحقيقية مرتبطة بالإدخال/الإخراج، فلا تبالغ في وزن هذا الصف - فهو اختبار ضغط للبرامج الوسيطة ذات الحوسبة الثقيلة، وليس CRUD النموذجي.
7.3 تحويل الحافة (الاختبارات 6-7، متغيرات NGINX)
طلبات فرعية واختبارات التوجيه حيث افتح ريستي لوا و إنجينكس إن جي إس تنتمي: لا توجد قفزات إضافية، وذاكرة عاملة مشتركة، وتقوم فرق العمليات بإدارة NGINX بالفعل. يوصي حكم الأداة باستخدام Go/Rust للواجهات الخلفية للدردشة/قائمة الانتظار الأساسية وLua/njs على الحافة - وهو تقسيم معقول تديره العديد من المؤسسات بالفعل بشكل غير رسمي.
7.4 دفعة ETL وخط أنابيب البيانات
لا يحاكي حزام HTTP أحمال Spark أو أحمال المستودعات. بالنسبة للدفعة، تقوم الفرق عادةً بإعطاء الأولوية لنظام Python البيئي والتنسيق (Airflow، Dagster) أو عمال Go من أجل الإنتاجية. استخدم مقاييس متعدد اللغات لـ أسطح API وطائرات التحكم تكشف هذه الوظائف، وليس للمحرك الدفعي نفسه.
7.5 أداة داخلية سريعة
المشرف الداخلي APIs مع QPS منخفض ومعدل تغيير مرتفع: غالبًا ما تفوز Python أو Bun/Node بالسرعة والتوظيف. تشغيل الاختبار 2 (JSON) والاختبار 5 (الفحص) لضمان قبول الحمل الزائد؛ إذا ارتفع مستوى p99 إلى أقل من 100 اتصال، فأعد النظر قبل الترقية إلى المستويات التي تتعامل مع العملاء.
7.6 ملكية JVM (Java وKotlin)
تقوم العديد من المؤسسات بالفعل بتشغيل Java أو Kotlin للمكتبات المشتركة وأدوات الامتثال وعمق التوظيف. الحزام java-server (Javalin على Jetty، المنفذ 8088) و kotlin-server (Ktor على Netty، المنفذ 8089) ينفذ نفس نقاط النهاية السبع مثل Go وRust، بحيث يمكنك تحديد ما إذا كانت حزمة JVM HTTP الأخف "جيدة بما يكفي" لـ SLO معين قبل إعادة الكتابة. تفضل Kotlin عندما يكون التزامن على نمط coroutine وفرق Kotlin الأولى مهمًا؛ تفضل Java عندما يكون الرسم البياني للعقارات والمكتبة المحيطة متمحورًا حول Java بالفعل. استخدم صفوف لوحة المعلومات المباشرة — لا تفترض أن أرقام Spring Boot تساوي أرقام Javalin/Ktor.
8. مخطط سير العمل

الحلقة القابلة للتكرار: حدد عبء العمل ← قم بتشغيل مجموعة أدوات Compose ← نشر النتائج على لوحة المعلومات Fictionally (أو نسختك الداخلية) ← قم بتسجيل ADR باستخدام بيانات تعريف التكوين ← أعد التشغيل عند تغيير أوقات التشغيل أو الأجهزة.
9. كيفية إجراء المقارنة الخاصة بك
- استنساخ:
git clone https://github.com/bwalia/workflow-examples.git && cd workflow-examples/benchmarks - مكدس البدء:
docker compose up --build— ينشئ جميع الصور اللغوية، ويبدأ تشغيل لوحة المعلومات على المنفذ 8083، ويقوم بتشغيل المنصة تلقائيًا. - يشاهد: يفتح
http://localhost:8083(أو الموقع العام عندما يكون التشغيل المستضاف نشطًا). - يمتد: إضافة مجلد
myruntime/، مرآة مسارات نقطة النهاية، تسجيل الخدمة فيdocker-compose.yml، قم بإلحاق الخادم بـSERVERSفيbench.sh. - تخصيص الحمل: يحرر
DURATION,THREADS,CONNECTIONSفي الجزء العلوي منbench.sh— وثيقة التغييرات في ADR الخاص بك. - إضافة اختبارات على شكل إنتاج: على سبيل المثال وسيطة المصادقة، استعلام ORM، حمولة 50 كيلو بايت - حافظ على التكافؤ بين اللغات.
بالنسبة إلى CI، قم بتشغيل Compose في سير العمل الليلي والأرشفة results.json باعتبارها قطعة أثرية، وتفشل فقط في عتبات الانحدار التي تحددها (على سبيل المثال، p99 +20% أسبوعيًا في الاختبار 2).
10. الأنماط المضادة
- اختيار الفائز في الاختبار 1 فقط - يفضل النص العادي الحد الأدنى من الأكوام؛ فهو يتجاهل JSON وCPU وألم التوجيه.
- إهمال مهارات الفريق — الصدأ في الإنتاج بدون موجهين مكلف في وقت الحادث.
- تجاهل تكلفة الاستضافة - 2 × RPS غير مجدية إذا كانت الذاكرة لكل جراب تضاعف فاتورتك.
- فرض لغة واحدة على مستوى المؤسسة - يدمر الحافة المشروعة مقابل الانقسامات الأساسية.
- استبدال ملف تعريف الإنتاج — HTTP الاصطناعي ≠ ORM أو ذاكرة التخزين المؤقت أو زمن الوصول الإقليمي.
- مقارنة على عكس الأجهزة — الكمبيوتر المحمول Docker ≠ المعدن العاري ≠ حدود K8s؛ لاحظ الفصل في ADR.
11. فوائد القيادة الهندسية
- حزم ARB - تصدير لقطات شاشة لوحة القيادة +
results.json+ إنشاء التجزئة. - أدلة محايدة للبائع — لا يوجد مجموعة مبيعات من بائع سحابي أو إطار عمل واحد.
- الوضوح على متن الطائرة — يرى الموظفون الجدد *لماذا* الخدمة A هي Go والخدمة B هي Python.
- الحد من المخاطر - قم بتجربة الوصيف في خدمة الظل قبل إعادة الكتابة.
- محادثات FinOps - ربط الكمون الخلفي بالقياس التلقائي وإرتفاع الذاكرة.
- خريطة طريق المنصة - تبرير الاستثمار في مهارات NGINX مقابل خدمة K8s الصغيرة الأخرى.
12. القيود
- أعباء العمل الاصطناعية - لا يمكن أن تمثل سبعة اختبارات HTTP مستهلكي Kafka أو وظائف GPU أو رسوم بيانية ORM معقدة.
- شبكات عامل الميناء - يضيف النفقات العامة. الأرقام المطلقة تختلف عن المعدن العاري.
- فئة آلة واحدة - تعكس النتائج المستضافة الأجهزة التي تستخدمها بشكل خيالي؛ سوف تختلف أرقامك.
- لا توجد طبقة الثبات - تأثيرات قاعدة البيانات وذاكرة التخزين المؤقت غائبة حسب التصميم.
- مدة التشغيل قصيرة — 10 ثواني لكل اختبار قد لا تعرض توقفات GC مؤقتًا أو منحدرات الإحماء؛ تمتد لحملات التوتر.
حافظ على التوصيف المستمر (eBPF، APM، اختبارات الحمل مقابل التدريج) كمصدر الحقيقة للإنتاج. تعمل مقاييس متعدد اللغات على تضييق النطاق اللغة والإطار مناقشة مع خطوط الأساس استنساخه.
13. الاستنتاج
يعتبر تحيز المكدس الافتراضي مريحًا؛ إنها أيضًا الطريقة التي تقوم بها الفرق بإرسال وقت التشغيل الخاطئ للمهمة. مقاييس متعدد اللغات و أمثلة سير العمل بدوره تسخير "أي لغة تفوز؟" في "أي لغة تفوز". لصف عبء العمل هذا؟" - مع المخططات التي يمكن لـ ARB الخاص بك الاستشهاد بها.
قم بتفرع الريبو، وأضف نقاط النهاية التي تبدو وكأنها مساراتك الساخنة، وقم بتشغيل الإنشاء، وقم بإرفاق النتائج بقرار البنية التالي. الرفيق مشاركة مدونة هي نسخة مدتها خمس دقائق للمشاركة؛ هذه المقالة هي المرجع.
نشرت من قبل Workstation (workstation.co.uk). لوحة التحكم المعيارية مستضافة في polyglot-benchmarks.fictionally.org في الأمثلة الخيالية للنظام البيئي.
لقطة SEO لهذه المقالة
- عنوان تحسين محركات البحث: مقاييس متعدد اللغات: الأداة المناسبة للوظيفة
- الوصف التعريفي: قارن بين njs وLua وPython وGo وRust وBun وJava وKotlin على أحمال عمل HTTP نفسها. أدوات قابلة للتكرار، ولوحة معلومات حية، ومصفوفة قرارات للمهندسين المعماريين.
- الكلمات الرئيسية الأساسية: معايير متعددة اللغات، مقارنة اللغة، قرارات الهندسة المعمارية، أمثلة سير العمل، معيار الأداء، Rust vs Go، Java vs Kotlin، FastAPI، Javalin، Ktor
- تويتر / X (أقل من 280 حرفًا): معايير Polyglot: نفس اختبارات HTTP السبعة عبر njs، وLua، وPython، وGo، وRust، وBun، وJava، وKotlin - لوحة القيادة المباشرة + أدوات أمثلة سير العمل. لا يوجد فائز واحد؛ إطار القرار. #Rust #GoLang #Java #Kotlin #Bunjs #polyglot
- مشاركة لينكد إن: لقد نشرنا بحثًا عميقًا حول Polyglot Benchmarks - كيفية التوقف عن اختيار مكدس واحد على مستوى المؤسسة من العادة والبدء في مطابقة أوقات التشغيل مع أعباء العمل. ثماني لغات (بما في ذلك Java/Javalin وKotlin/Ktor)، وسبعة اختبارات قابلة للمقارنة، وDocker Compose + wrk، والنتائج المباشرة على polyglot-benchmarks.fictionally.org، المصدر على github.com/bwalia/workflow-examples/tree/main/benchmarks. تتضمن مصفوفة القرار والأنماط المضادة وتوجيهات ADR. من هندسة Workstation. #Rust #GoLang #Java #Kotlin #Bunjs #Lua #Python #njs #FastAPI #Javalin #Ktor #OpenResty #polyglot #benchmarks