تا حالا شده یه اپلیکیشن یا سایت خفن بسازی، بعد یهو یه کمپین تبلیغاتی بری یا وایرال بشی و از شدت ترافیک، سرورت همون دقیقه اول دود کنه بره هوا؟  اینجاست که میفهمیم فقط کار کردن کد مهم نیست، بلکه استقامت اون زیر فشار هزاران کاربر هم به‌شدت مهمه. امروز میخوایم درباره یه ابزار به‌شدت جذاب و کاربردی به اسم Locust (به معنی ملخ!) حرف بزنیم که کارش دقیقاً همینه: شبیه‌سازی هجوم کاربران به سیستم شما، قبل از اینکه تو دنیای واقعی غافلگیر بشید.

Locust چیه؟ 

فریمورک Locust یه ابزار متن‌باز (Open-Source) برای تست بار (Load Testing) و تست استقامت (Stress Testing) بک‌انده. ایده‌اش اینه که شما یه لشکر از کاربران مجازی (همون ملخ‌ها!) رو میفرستید سمت سایت یا API خودتون تا ببینید سیستم تا کجا میتونه مقاومت کنه و کی تسلیم میشه.

برخلاف خیلی از ابزارهای قدیمی‌تر که با رابط‌های کاربری پیچیده یا فایل‌های XML عجیب‌وغریب کار میکردن، Locust یه برگ برنده بزرگ داره: همه‌چیز با پایتون نوشته میشه!

چرا باید از Locust استفاده کنیم؟ 

اگه بخوام خیلی رک و خودمونی بگم، چند تا دلیل هست که برنامه‌نویس‌ها (مخصوصاً پایتون‌کارها) بدجور با این فریمورک حال میکنن:

  • کدنویسی به جای کلیک کردن: سناریو های تست رو با کدهای ساده پایتون مینویسید. این یعنی میتونید هر منطق پیچیده‌ای (مثل لاگین کردن، گشتن تو سایت، اضافه کردن محصول به سبد خرید و...) رو دقیقاً مثل یه کاربر واقعی شبیه‌سازی کنید.

  • رابط کاربری (UI) تر و تمیز: وقتی تست رو اجرا میکنید، یه داشبورد وب خیلی خوشگل بهتون میده که توش می‌تونید لحظه به لحظه ببینید چند نفر تو سایتن، زمان پاسخگویی (Response Time) چقدره و چند درصد ریکوئست‌ ها دارن Fail میشن.

  • قدرت توزیع‌پذیری بالا (Distributed): اگه یه کامپیوتر برای شبیه‌سازی ۱۰۰ هزار کاربر کافی نیست، Locust میتونه روی چند تا ماشین مختلف پخشش کنه تا یه حمله همه‌جانبه (DDoS خودی!) به سرورتون بزنه.

  • مصرف منابع کم: چون از Event-loop ها (بر پایه gevent) استفاده میکنه، روی یه لپ‌تاپ معمولی هم می‌تونه هزاران کاربر همزمان رو شبیه‌سازی کنه.

چطوری کار میکنه؟ (یه مثال خیلی سریع)

فرض کنید میخوایم صفحه اصلی سایتمون و یه صفحه پروفایل رو تست کنیم. کدی که برای Locust مینویسیم یه چیزی شبیه به این میشه:

from locust import HttpUser, task, between

class MyWebsiteUser(HttpUser):
    # کاربرا بین 1 تا 5 ثانیه تو سایت مکس می‌کنن (مثل یه آدم واقعی)
    wait_time = between(1, 5)

    @task(3)
    def load_homepage(self):
        self.client.get("/")

    @task(1)
    def load_profile(self):
        self.client.get("/profile")

توضیح خودمونی کد بالا:

  • ما یه کلاس ساختیم که نماینده یه کاربره.

  • با wait_time گفتیم این کاربرِ مجازی بعد از هر کلیک، بین ۱ تا ۵ ثانیه مکث میکنه که رفتارش طبیعی باشه.

  • با دکوریتور @task مشخص کردیم که کاربر چه کارایی باید بکنه. اون عددهای جلوش (۳ و ۱) یعنی وزن اون کار. مثلاً تو این سناریو، احتمال اینکه کاربر صفحه اصلی رو ببینه ۳ برابر بیشتر از اینه که بره تو پروفایلش. به همین سادگی!

چطوری اجراش کنیم؟ 

کافیه پایتون رو نصب داشته باشید و تو ترمینال بزنید:

pip install locust

بعد فایلی که نوشتید (مثلاً locustfile.py) رو با این دستور اجرا کنید:

locust -f locustfile.py

حالا مرورگر رو باز کنید و برید به آدرس http://localhost:8089. داشبورد Locust میاد بالا و ازتون میپرسه: "چند تا کاربر میخوای؟ و با چه سرعتی اضافه بشن؟" مقادیر رو میدید و دکمه Start رو میزنید. حالا کافیه بشینید و با یه لیوان چای، جون کندن سرورتون رو تماشا کنید! 

جمع بندی

هیچ‌وقت منتظر نمونید تا تو روز بلک‌فرایدی یا بعد از یه تبلیغ گرون‌قیمت اینستاگرامی، ظرفیت بک‌اندتون تست بشه. با Locust میتونید خودتون تو شرایط امن، سرور رو تحت فشار بذارید، گلوگاه‌ها (Bottlenecks) رو پیدا کنید، دیتابیس رو بهینه‌تر کنید و وقتی روز موعود رسید، با خیال راحت و یه لبخند پیروزمندانه، از ترافیک بالا لذت ببرید.