Lewati ke konten

Pembatasan Laju

Queuety mendukung pembatasan laju per handler untuk mencegah API eksternal atau sumber daya terbatas lainnya kewalahan. Saat handler mencapai batasnya, worker membiarkan pekerjaannya tetap tertunda dan mengambilnya kembali setelah jendela menyediakan kapasitas.

Menetapkan batas laju

Terapkan batas laju saat mengirim pekerjaan:

PHP
use Queuety\Queuety;

Queuety::dispatch( 'call_openai', $payload )
    ->rate_limit( 10, 60 ); // max 10 executions per 60 seconds

Kedua argumen tersebut adalah:

  1. $max - Jumlah maksimum eksekusi yang diizinkan dalam jendela
  2. $window - Durasi jendela dalam detik

Batas yang ditetapkan saat pengiriman hanya didaftarkan di proses PHP yang mengirim pekerjaan. Worker yang berjalan di proses terpisah, seperti wp queuety work, tidak dapat melihatnya, jadi tetapkan batas yang harus berlaku lintas proses di config() milik handler seperti ditunjukkan di bawah ini (#3).

Batas laju tingkat handler

Tetapkan batas laju dalam metode config() milik handler agar berlaku untuk setiap pengiriman:

PHP
use Queuety\Handler;

class CallOpenAIHandler implements Handler {
    public function handle( array $payload ): void {
        // Call the API...
    }

    public function config(): array {
        return [
            'rate_limit' => [ 60, 60 ], // 60 requests per minute
        ];
    }
}

Cara kerjanya

Batas laju dilacak berdasarkan nama handler. Setelah mengambil pekerjaan, worker mendaftarkan batas handler (dari config() miliknya) dan memeriksa pembatas laju. Jika handler telah mencapai batasnya, worker langsung mengembalikan pekerjaan ke pending tanpa jeda dan tanpa menghabiskan satu percobaan, lalu tidur selama QUEUETY_WORKER_SLEEP detik sebelum melakukan polling lagi. Worker yang dimulai dengan --once akan keluar.

Setiap worker menyimpan penghitung di memori dan memperbaruinya setiap 5 detik dari tabel queuety_logs, dengan menghitung entri log completed untuk handler dalam $window detik terakhir. Karena jumlahnya diambil dari tabel log bersama (dan dari cache bersama jika dikonfigurasi), batas tingkat handler diberlakukan di semua proses worker, bukan hanya di satu worker. Eksekusi yang gagal tidak dihitung dalam batas.

Akses terprogram

Akses pembatas laju secara langsung:

PHP
$limiter = Queuety::rate_limiter();

// Register a rate limit
$limiter->register( 'call_openai', 60, 60 );

// Check whether a handler has reached its limit
$limited = $limiter->is_limited( 'call_openai' ); // true while the limit is reached

// Seconds until the current window resets
$wait = $limiter->time_until_available( 'call_openai' );

register() dan is_limited() bekerja pada pembatas di proses PHP saat ini. Mendaftarkan batas di sini tidak mengubah batas yang diberlakukan oleh worker yang berjalan secara terpisah.

Kasus penggunaan

  • Batas API eksternal. Sesuaikan batas laju dengan kuota API (e.g., 60 RPM milik OpenAI).
  • Pembatasan email. Cegah pengiriman terlalu banyak email dalam waktu singkat.
  • Perlindungan sumber daya. Batasi handler yang intensif menggunakan CPU agar pekerjaan lain tidak kekurangan sumber daya.