Post by AHMED HANY
Software Engineer | Computer Science Bachelor
فيه مواقف بتفكرك إن أصعب حاجة في الشغلانة مش إنك تكتب كود، أصعب حاجة إنك تفهم ليه الكود اللي شغال أصلاً بيقف من نفسه. كنا لسه فاتحين مشروع جديد على Laravel، والمشروع كان معتمد بشكل أساسي على الـ Queue Workers في معالجة العمليات: إشعارات، تقارير، عمليات خلفية كتير. بعد الإطلاق بساعات قليلة، لاحظنا حاجة غريبة: السيرفر بيقف من نفسه كل شوية. مش كل يوم، ومش في وقت ثابت، لأ. كل شوية السيرفر بيهنج، الـ workers بتقف، والمهام بتتراكم من غير أي سبب واضح. أول حاجة عملتها إني فتحت الـ logs، ومفيش أي error واضح بيقول "المشكلة هنا". راجعت الـ Horizon dashboard، لقيت استهلاك الـ memory بتاع الـ workers بيزيد بشكل تدريجي مع كل job بيتنفذ، لحد ما يوصل لحد أقصى والسيرفر يعمل kill للعملية من نفسه. هنا فهمت إن المشكلة مش في job معين، المشكلة إن الـ memory مش بترجع تفرغ بين كل job والتاني. قعدت أراجع كل حاجة بتتخزن في الـ memory أثناء تنفيذ الـ jobs، لحد ما لقيت إن الـ query log كان شغال بشكل غير مقصود في بيئة الإنتاج، وده خلى كل query بيتنفذ في أي job بيفضل متسجل في الذاكرة من غير ما يترمي، وبما إن الـ workers شغالة long-running، الذاكرة كانت بتكبر لحد ما تنفجر. قفلت الـ query log، وضفت --max-jobs على الـ workers عشان لو أي حاجة تانية زي كده حصلت في المستقبل، الـ worker يعمل restart لنفسه قبل ما يوصل لمرحلة الانهيار. بعد كام ساعة تركيز، السيرفر استقر، والـ jobs رجعت تتنفذ بشكل طبيعي. الدرس اللي طلع من الموقف ده: مش كل مشكلة أداء بتبان في الكود اللي بتكتبه، أحياناً بتكون في إعدادات صغيرة ناسيها شغالة من مرحلة التطوير ونسيت تقفلها قبل الإنتاج. #Laravel #BackendDevelopment #تطوير_برمجيات