مانیتورینگ کوئریهای MongoDB در لاراول با Middleware سفارشی
خلاصهٔ کاملتر
یکی از سختترین نوع مشکلات در توسعه نرمافزار، مشکلات پرفورمنسه؛ چون باگ نیستن. اپ کار میکنه، ولی کند. کاربر صبر میکنه، شما سردرگم میمونید. اکثر اوقات هم دلیلش توی یه کوئری پایگاه دادهست که یا ایندکس نداره، یا یه عملیات سنگین داره تکرار میشه. بدون ابزار مناسب، پیدا کردن این مشکلات شبیه دنبال سوزن توی انباره.
این مقاله یه سیستم مانیتورینگ سبک میسازه که مخصوص پروژههای لاراول با MongoDB طراحی شده. هدف اینه که بفهمیم هر کوئری چقدر طول میکشه، کدوم روت درخواست رو کند کرده، و کدوم عملیات باید بهینه بشه.
معماری این سیستم از دو بخش اصلی تشکیل شده. اول یه Middleware سفارشی لاراول که زمان کل هر HTTP Request رو از ابتدا تا انتها اندازهگیری میکنه. دوم یه کلاس به اسم MongoDB Command Subscriber که مستقیماً به درایور PHP مربوط به MongoDB وصل میشه و هر بار که یه دستور به پایگاه داده میره، یه رویداد دریافت میکنه. این رویدادها شامل نوع عملیات (مثل find، insert، aggregate)، اسم کالکشن، و زمان اجرا هستن.
برای ذخیره اطلاعات، یه کالکشن به اسم performance_logs در MongoDB استفاده میشه. یه سرویس به اسم QueryMonitorService وظیفه جمعآوری این دادهها رو داره. این سرویس یه آستانه زمانی تعریف میکنه و هر کوئری که از اون آستانه رد بشه، به عنوان کوئری کند علامتگذاری میشه.
وقتی MongoDB Command Subscriber یه رویداد موفق دریافت میکنه، مدت زمان اجرا رو حساب میکنه و به QueryMonitorService پاس میده. بعد از تموم شدن Request، Middleware اصلی کل دادههای جمعآوریشده رو به همراه اسم روت و مدت زمان کل Request در دیتابیس ذخیره میکنه.
برای اینکه لاگهای قدیمی پایگاه داده رو پر نکنن، از TTL Index مربوط به MongoDB استفاده میشه. این ایندکس به MongoDB میگه بعد از یه بازه زمانی مشخص، دادههای قدیمی رو خودش پاک کنه؛ بدون اینکه نیازی به کرونجاب یا جاب جداگانه باشه.
ساختار پروژه شامل یه مدل Post برای تست، یه مدل PerformanceLog برای ذخیره لاگها، کلاسهای Subscriber و Service، و پیکربندی کانکشن MongoDB در فایلهای .env و database.php میشه. کل این سیستم روی پکیج رسمی laravel-mongodb ساخته شده که بهتون اجازه میده از Eloquent ORM لاراول مستقیماً با MongoDB کار کنید.
نتیجه نهایی یه ابزار سبکه که میتونه توی هر پروژه لاراول-MongoDB راه بیفته و بهتون نشون بده کجای اپ کند میشه، چه کوئریهایی مشکوک هستن، و چه روتهایی بیشترین بار رو روی دیتابیس میذارن.
نکات کلیدی:
- مشکلات پرفورمنس معمولاً توی کوئریهای دیتابیس پنهان هستن، نه در کد اپلیکیشن
- MongoDB Command Subscriber به درایور PHP وصل میشه و رویدادهای کوئری رو بهصورت real-time دریافت میکنه
- Middleware سفارشی زمان کل هر HTTP Request رو اندازه میگیره
- کوئریهای کند بر اساس یه آستانه زمانی تعریفشده بهصورت خودکار شناسایی میشن
- TTL Index مربوط به MongoDB لاگهای قدیمی رو بدون دخالت دستی پاک میکنه
- پکیج رسمی laravel-mongodb امکان استفاده از Eloquent رو با MongoDB فراهم میکنه




