البرمجة

تحسين أداء Spring Boot باستخدام Async Controllers

لفهم سبب عدم سلوك الـ /api/2 كما هو متوقع، يتعين علينا التفكير في كيفية عمل الـ Async Controllers في Spring. عندما تقوم بإرجاع Callable من طريقة الوحدة التحكم، فإن Spring يأخذ هذا الـ Callable ويضعه في قائمة الأعمال القادمة لمواضيع ThreadPool الخاص به، وليس لديه تأثير مباشر على قدرة Tomcat على استقبال المزيد من الطلبات.

في هذه الحالة، على الرغم من أن الـ Callable يبدأ في تنفيذه في خيط مختلف (وبالتالي يتوفر الخيط الرئيسي لـ Tomcat لمعالجة طلبات جديدة)، إلا أن خيط الـ ThreadPool لا يمكنه أن يعالج طلبات جديدة حتى يكتمل تنفيذ الـ Callable. هذا يعني أنه بمجرد استقبال طلب /api/2، ستقوم Spring بإضافة الـ Callable للتنفيذ في خيط منفصل، ولكن الـ ThreadPool لن يكون قادرًا على استقبال أي طلبات جديدة حتى ينتهي تنفيذ الـ Callable.

لحل هذه المشكلة، يمكنك زيادة حجم ThreadPool لـ Tomcat لتتيح له استقبال المزيد من الطلبات في نفس الوقت. يمكنك فعل ذلك عن طريق ضبط خاصية server.tomcat.max-threads في ملف تكوين Spring Boot الخاص بك. ومن المهم أيضًا فهم أن استخدام Callable يعني أن لديك القدرة على تنفيذ العمليات الطويلة في خلفية منفصلة بينما تبقى الخيوط الرئيسية متاحة لخدمة المزيد من الطلبات.

المزيد من المعلومات

بالطبع! عند استخدام الـ Callable في Spring، يتم إنشاء مهمة (Task) جديدة في ThreadPool خاص بـ Tomcat لتنفيذ الكود الموجود داخل الـ Callable. عندما يتم استدعاء الـ Callable، يتم وضعها في قائمة الانتظار في ThreadPool، وعندما يتاح له خيط فرعي متاح في الـ ThreadPool، يتم تنفيذ الكود الموجود في الـ Callable في هذا الخيط.

ومن الجدير بالذكر أن استخدام الـ Callable في Spring لا يؤثر على عدد خيوط الـ Tomcat المتاحة لخدمة الطلبات الجديدة، ولكنه يؤثر على الـ ThreadPool الذي يستخدمه Tomcat لتنفيذ المهام الخلفية. لذا، إذا كانت لديك حالة حيث ترغب في السماح لـ Tomcat بخدمة المزيد من الطلبات أثناء تنفيذ مهمة طويلة، يجب زيادة حجم ThreadPool لـ Tomcat.

إذا كنت ترغب في مزيد من التفاصيل حول كيفية زيادة حجم ThreadPool في Tomcat في Spring Boot، فأنا هنا للمساعدة.

زر الذهاب إلى الأعلى