Redis u fronty vypadá jako samozřejmost. Jenže k čemu ti je další služba, když už máš databázi, kterou zálohuješ a hlídáš? U většiny malých projektů si s ní vystačíš.
Co budeš potřebovat
Stačí tabulka s úlohami a worker, který z ní čte. Laravel to umí od základu:
php artisan make:queue-table
php artisan migrate
php artisan queue:work --tries=3
V .env pak přepneš driver na database. Nic dalšího se neinstaluje.
Úloha, která se může opakovat
Každá úloha by měla jít bezpečně spustit víckrát. Worker ji po chybě zkusí znovu, takže si hlídej idempotenci:
class SendInvoice implements ShouldQueue
{
public int $tries = 3;
public function handle(InvoiceMailer $mailer): void
{
$mailer->sendOnce($this->invoice);
}
}
Kde to začne drhnout
Databázová fronta má limity. Tohle jsem naměřil na malém serveru:
| Driver | Úloh za sekundu | Latence | Poznámka |
|---|---|---|---|
| database | 120 | 1 s | stačí na faktury a e-maily |
| redis | 2 400 | 5 ms | zbytečné, dokud nenarazíš |
Dokud workery nečekají na zámek tabulky, nemáš problém. Až začnou, přejdi na Redis.
Přechod je naštěstí nudný. Změníš driver a zbytek kódu zůstane stejný.
Kdy přejít jinam
- Fronta roste rychleji, než ji workery vybírají.
- Úlohy musí běžet do pár milisekund.
- Databáze už tak dost pracuje a fronta jí bere výkon.
Pokud nic z toho neplatí, zůstaň u databáze. Podrobnosti najdeš v dokumentaci Laravelu a seznam úloh uvidíš přes php artisan queue:monitor.