New Laravel 5.5 Features: Laravel Horizon
Bài đăng này đã không được cập nhật trong 7 năm
Lời nói đầu
Với một developer chắc các bạn đã từng đau đầu về các vấn đề khi sử dụng queue
- hàng đợi . Chúng được sử dụng để gửi mail, để làm notification, để tính toán các job ngoài luồng hay chỉ đơn giản là lưu dữ liệu để giảm tải công việc cho server trong thời gian cao điểm.
Tuy chúng rất được việc nhưng cũng cực kì phiền phức khi quản lí các hàng đợi đó lắm. Việc thống kê các queue , queue thành công hay thất bại và nếu thất bại thì chạy lai queue bao nhiêu lần ... Thường thường thì bạn vẫn phải làm các công việc này bằng cách code tay, hiển nhiên việc này hết sức phiền phức cũng như dễ gây lỗi và 1 khi có lỗi thì rất khó debug ra vấn đề nằm ở đâu.
Thật may, trong version 5.5 chúng ta đã có Horizon
package để quản lí các vấn đề này. Nào hãy cùng bắt tay vào nghiên cứu nhé .
Nội dung
Giới thiệu
Horizon
cung cấp cho bạn một bảng điều khiển và cấu hình dựa trên mã cho các hàng đợi Redis của Laravel. Horizon
cho phép bạn dễ dàng theo dõi các chỉ số quan trọng của hệ thống hàng đợi như thông lượng công việc, thời gian chạy, và các job
thất bại.
Tất cả cấu hình worker
của bạn được lưu trữ trong một tệp cấu hình , cho phép bạn kiểm soát được hệ thống hàng đợi của app.
Installation
Bạn có thể sử dụng composer
để cài đặt package
về cho app của bản thân bằng câu lệnh:
composer require laravel/horizon
Sau khi đã load được package về bạn sử dụng câu lệnh sau để tạo file cấu hình cho app :
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
Xong, chỉ là đơn giản như vậy thôi !
Configuration
Sau khi chạy 2 lên bên trên kia xong, file cấu hình chính sẽ được đặt tại config/horizon.php
. Tệp cấu hình này cho phép bạn định cấu hình tùy chọn worker
của mình và mỗi tùy chọn cấu hình bao gồm mô tả mục đích của nó:
<?php
// horizon config file
[
// ...,
'environments' =>
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'processes' => 10,
'tries' => 3
]
],
'local' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'notifications'],
'balance' => 'simple',
'processes' => 20,
'tries' => 3,
'min-processes' => 5, // optional config
]
]
// ...
'waits' => ['redis:default' => 5] // If I read this syntax correctly, sets how long to wait before consider queue "backed up"
];
Balance Options
Bạn có thể nhận thấy rằng một trong các tùy chọn trong cấu hình là balance
, được đặt thành simple
trong mỗi ví dụ nhất định. Cân bằng hàng đợi mô tả các chiến lược để xử lý cách Horizon phân chia tài nguyên giữa hai queue
.
Để cụ thể hơn, mình sẽ đưa ra ví dụ cụ thể cho các bạn hiểu : Bạn có 2 queue :
notifications
: Có 1000 job đang chờrender
: Không có job nào chờ cả
Thuộc tính này có 3 sự lựa chọn :
simple
: Đây là sự lựa chọn mặc định . Khi cấu hình với giá trị này tức là cácqueue worker
sẽ chia đều khối lượng xử lí giữa 2queue
bất kể khối lượng công việc. Trong ví dụ ở đây : thì 2queue
lànotifications
vàrender
sẽ được chia đều cácqueue worker
auto
: Với sự lụa chọn này thìHorizon
sẽ điều chỉnh số lượng cácqueue worker
trên mỗi hàng đợi dựa trên khối lượng công việc hiện tại của hàng đợi . Với trường hợp trong ví dụ thìHorizon
sẽ chỉ định thêm cácqueue worker
chonotifications
cho đến kho queuenotifications
không cònjob
nào nữa.false
: Với sự lụa chọn này thì chiến lược về cân bằng sẽ không được sử dụng, default các job sẽ đk diễn ra theo đúng thứ tự trong listqueue
đã được config.
Running Horizon
Khi bạn đã cấu hình xong của bạn trong tập tin config/horizon.php
, bạn có thể bắt đầu Horizon
bằng lệnh Artisan horizon
. Lệnh này sẽ bắt đầu tất cả các queue worker
được cấu hình của bạn:
php artisan horizon
Bạn cũng có thể tạm dừng hoặc chỉ thi tiếp tục tiến hành cho horizon
bằng lệnh:
php artisan horizon:pause // dừng horizon lại tuy nhiên các worker vẫn làm việc
php artisan horizon:continue
Bạn cũng có thể dỡ bỏ hoàn toàn horizon
khỏi máy của bạn bằng câu lệnh :
php artisan horizon:terminate
Với câu lệnh này, horizon
sẽ xử lý hết các job hiện đang xử lý của queue và sau khi xử lý xong, horizon
sẽ bị dỡ bỏ hoàn toàn khỏi máy tính của bạn ...
Tags
Với mỗi job
được thực hiện, horizon
sẽ tự động đánh 1 cái tag
cho job
đó . Trên thực tế, Horizon sẽ tự động tag các jobs một cách thông minh và tự động tùy thuộc vào các Eloquent model gắn liền với job. Tính năng này giúp bạn có thể dễ dàng tìm kiếm các jobs của bạn thông qua các tags.
Ví dụ bạn có 1 job như sau :
$video = App\Video::find(1);
App\Jobs\RenderVideo::dispatch($video);
Với 1 job
như thế này thì horizon
sẽ tự động gán tag App\Video:1
cho job này. Tuy nhiên, bạn hoàn toàn có thể custom lại tên job này theo ý muốn của mình bằng cách define lại tag()
function trong class job của bạn, Ví dụ như sau :
class RenderVideo implements ShouldQueue
{
/**
* Get the tags that should be assigned to the job.
*
* @return array
*/
public function tags()
{
return ['render', 'video:'.$this->video->id];
}
}
Sau đó, bạn có thể vào phần theo dõi thẻ và chọn kéo các thẻ cụ thể; ví dụ. Email khách hàng gặp sự cố với Hoá đơn 14; Bạn có thể theo dõi Hoá đơn: 14 thẻ và chỉ xem một chút để xem những gì đang xảy ra, không thành công
Failed jobs
Với mỗi job
không thành công, Horizon theo dõi dấu vết chồng chéo và tất cả các dữ liệu có liên quan, làm cho nó dễ hiểu để bạn nhận ra đk lý do của sự thất bại.
Bạn cũng có thể chọn để thử lại một job
không thành công sau khi giải quyết nguyên nhân để nó để thất bại.
Kết luận:
Sau khi tìm hiểu thì mình thấy đây là 1 package hay để quản lý queue
. Mình nghĩ nó sẽ giúp ích rất nhiều cho các app cần sử dụng đến queue
vì nó đã đưa ra được 1 hệ thống quản lý rất rõ ràng và rành mạnh , giúp chúng ta quản lý và phát hiện được những vấn đề phát sinh khi sử dụng hàng đợi. Bài viết này mình chỉ nói về cách cài đặt và config của horizon
. Nếu các bạn muôn cái nhìn tổng quan hơn về nó thì có thể xem ở đây để có 1 cái nhìn tổng quát hơn về nó
Tài liệu tham khảo
https://mattstauffer.co/blog/introducing-laravel-horizon-a-dashboard-for-your-queues/ https://laravel.com/docs/5.5/horizon
All rights reserved