الدافع
تتيح لك بنية Microservice الاختيار بين التقنيات ولغات البرمجة عند كتابة خدمات REST api. ما هي اللغة الأفضل للاختيار عند كتابة تطبيق REST api لتزويد المستخدمين المتزامنين بإجابة سريعة ومستقرة على نفس الجهاز؟ للإجابة على هذا السؤال ، سيكون من الجيد رؤية الفرق في أداء نفس التطبيق المكتوب بلغة Java و GO.
تنويه
جميع النتائج المقدمة في هذه التجربة هي مثال خاص على استخدام Java و GO ويجب عدم استخدامها لوصف أداء هذه اللغات في ظروف أخرى.
الشروط / الشروط
- لا توجد إعدادات إضافية لزيادة الإنتاجية. يجب استخدام الإطارات والمكتبات مع الإعدادات الافتراضية.
- لا توجد أطر ORM. فقط برامج تشغيل قاعدة البيانات ونفس الاستعلامات في كلا التطبيقين.
الخطة
- لنقم بإنشاء تطبيقين بسيطين REST api في Java و GO باستخدام قاعدة بيانات PostgreSQL
- إنشاء اختبارات تحميل مع جيميتر
- قم بتشغيل كل تطبيق وقاعدة بيانات واختبارات على حالات AWS منفصلة
- قم بإجراء الاختبارات وجمع النتائج
تطبيق الاختبار
كنظام للاختبار ، أنشأت تطبيقين:
bank-java و
bank-go . ربما يكون هذا هو أبسط تطبيق مصرفي في العالم. كل ما يمكنها فعله هو إنشاء عملاء جدد برصيد مبدئي ، وتحويل الأموال من عميل إلى آخر وإظهار الرصيد.
API:- Post / client / new / {Balance} - إنشاء عميل برصيد مبدئي
- Post / Transaction - تحويل الأموال من عميل إلى آخر
- Get / client / {id} / Balance - يظهر الرصيد
الهياكل والمكتبات
عند اختيار هذه المداخن ، استخدمت أحدث الأطر والمكتبات الأحدث والأكثر شيوعًا والأبسط لتنفيذ الوظائف الضرورية في أسرع وقت ممكن.
Bank-java: Java 11 ، boot spring 2.0.4 ، spring-web 5.0.8 ، PostgreSQL JDBC 4.2.4
Bank-go: Go 1.8، gorilla / mux، github.com/lib/pq
بيئة الاختبار
تم استخدام AWS كبيئة اختبار.
تم إنشاء مثيلات EC2 التالية:
- Bank-go t2.micro (وحدات ECU متغيرة ، 1 vCPUs ، 2.5 جيجاهرتز ، عائلة Intel Xeon ، 1 ذاكرة GiB ، EBS فقط)
- Bank-java t2.micro (وحدات ECU متغيرة ، 1 vCPUs ، 2.5 جيجا هرتز ، Intel Xeon Family ، 1 ذاكرة GiB ، EBS فقط)
- Postgres d2.xlarge (14 وحدة نقدية أوروبية ، 4 وحدات vCPUs ، 2.4 جيجا هرتز ، Intel Xeon E52676v3 ، ذاكرة 30.5 جيجا بايت ، 3 × 2048 جيجا بايت سعة تخزين)
- اختبار بنكي t2.2x بحجم كبير (وحدات تحكم إلكترونية متغيرة ، و 8 وحدات معالجة مركزية ، و 2.3 جيجاهرتز ، و Intel Broadwell E5-2686v4 ، وذاكرة 32 غيغابايت ، و EBS فقط)
تستخدم جميع النسخ Ubuntu Server 18.04 LTS (HVM) ، نوع وحدة تخزين SSD

مشروع اختبار
يستدعي
اختبار Jmeter كل واجهة برمجة تطبيقات من القائمة أعلاه ، ويتحقق من أن حالة الاستجابة هي 200 وأن نص الاستجابة يحتوي على معرف. لكل تطبيق ، أطلقته بعدد المستخدمين المتزامنين 1000 ، 2000 ، إلخ. حتى 10000.
يمكن العثور على سجل كامل للنتائج
هنا .
النتائج المجمعة



وصف النتائج
يعمل كلا التطبيقين بشكل مثالي مع عدد المستخدمين 1000. بدءًا من 2000 GO ، يبدأ التطبيق في فقده بشكل ملحوظ في الأداء وقليلاً من الاستقرار. في Java ، يبدأ هذا الخط بـ 3000.
الخلاصة
باستخدام نفس جهاز REST api ، يمكن أن يدعم تطبيق Java ضعف عدد المستخدمين المتزامنين * كتطبيق GO مع قاعدة بيانات PostgreSQL.
* هذا الرقم صحيح فقط عند استخدام نفس ظروف الاختبار كما في هذه التجربة.