راه‌حلی ساده برای محدود کردن درخواست‌ها با Redis::throttle

بدون شک برای شما هم پیش آمده که از وب‌سرویسی استفاده می‌کنید که در هر دقیقه تنها تعداد محدودی درخواست مجاز است و موضوع «محدود کردن درخواست‌ها» و مدیریت آن گاهی ساعت‌ها زمان می‌برد.

امدم توی این مقاله بهتون توضیح بدیم که چطوری میشه زیر ۱ دقیقه این فرایند رو مدیریت کرد 😁.

قبل از هرچیزی از نصب بودن Redis و پلاگین php اون مطمئن بشید و بعد بیاید باهم بررسی کنیم که چطوری میشه ازش استفاده کرد.

روی ابونتو راحت میشه با این ۲تا خط نصبشون کرد

sudo apt-get install redis
sudo apt install php{version}-redisCode language: JavaScript (javascript)

خب استفاده کردن ازشون خیلی ساده هست فقط کافیه اول .env رو تنظیم کنید

پورت پیش‌فرض redis روی 6379 تنظیم شده

REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379Code language: JavaScript (javascript)

خب syntax کلی خیلی ساده است

\Illuminate\Support\Facades\Redis::throttle('uniq key for action')
    ->allow(3) // تعداد درخواست های مجاز
    ->every(60) // توی چه بازه‌ای اون درخواست ها مجاز هستند
    ->block(2) // بعد از این که تعداد مجاز تموم شد چقدر صبر کنه
    ->then(function () {
        // اگر مجاز بود این قسمت اجرا میشه
        return 'working ...';
    }, function () {
        // ولی اگر درخواست مجاز نبود میاد توی این قسمت
        return 'wait ...';
    });Code language: PHP (php)

تفسیر کد بالا میشه: تعداد مجاز، ۳ درخواست در هر دقیقه هست و زمانی که درخواست‌های مجاز تمام شد ۲ثانیه صبرکن و بعدا عملیات مربوط به عملیات غیرمجاز رو انجام بده.

دیدید چقدر ساده بود؟ 😂

میشه ازش توی Job ها هم استفاده کرد.

<?php

namespace App\Jobs;

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Log;

class RedisJob implements ShouldQueue
{
    use Queueable;

    public int $tries = 100; // حواستون به این باشه وگرنه job ها به خطا می‌خورند

    /**
     * Create a new job instance.
     */
    public function __construct()
    {
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        \Illuminate\Support\Facades\Redis::throttle('redisjob')
            ->allow(3)
            ->every(60)
            ->block(0)
            ->then(function () {
                Log::info('show :D');
            }, function () {
                $this->release(10);
            });
    }
}Code language: HTML, XML (xml)

امیدوارم از این آموزش خوشتون آمده باشه 😅

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *