Làm chủ Quản lý Queue với Laravel Horizon
Nếu bạn sử dụng Redis cho Laravel queues (và bạn nên làm vậy), Laravel Horizon là add-on bắt buộc. Nó cung cấp một dashboard đẹp mắt và cấu hình dựa trên code cho queue workers của bạn.
Tại sao chọn Horizon?
Không có Horizon, chạy queues trông như thế này trong supervisor.conf:
php artisan queue:work redis --queue=default,emails,high
Với Horizon, cấu hình trong config/horizon.php, nó tự động xử lý auto-scaling, balancing và monitoring.
Bắt đầu nhanh
- Cài đặt:
composer require laravel/horizon
php artisan horizon:install
- Chạy:
php artisan horizon
Cấu hình theo môi trường
Horizon cho phép các setup khác nhau cho local và production.
config/horizon.php
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'notifications'],
'balance' => 'auto', // Phép màu!
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
],
],
],
Phép màu của balance => 'auto'
Đây là tính năng killer của Horizon.
Nếu queue notifications của bạn tích tụ 1000 jobs, nhưng default thì trống, Horizon sẽ tự động chuyển workers từ default sang notifications để xử lý backlog, sau đó chuyển lại.
Các tính năng chính
1. Metrics & Throughput
Xem chính xác có bao nhiêu jobs chạy mỗi phút, và chúng mất bao lâu. Cần thiết để xác định các API calls bên thứ ba chậm trong jobs của bạn.
2. Quản lý Failed Job
Xem exception stack trace trực tiếp trong UI và click "Retry" để đưa job vào queue lại.
3. Silencing Jobs
Nếu bạn có job PingServer chạy mỗi phút, nó làm rối logs. Bạn có thể silence nó trong cấu hình để nó không xuất hiện trong "Completed Jobs" nhưng lỗi vẫn được báo cáo.
Deployment
Trong cấu hình Supervisor trên production, bạn chỉ chạy MỘT command:
[program:horizon]
command=php /path/to/artisan horizon
stopwaitsecs=3600
Sau đó sử dụng php artisan horizon:terminate trong deploy script để restart nó an toàn.
Horizon biến "hộp đen" của xử lý background thành một hệ thống minh bạch, có thể quản lý được.