New Laravel 5.5 Features: Laravel Horizon
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 ...
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é .
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="LaravelHorizonHorizonServiceProvider"
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ác queue worker sẽ chia đều khối lượng xử lí giữa 2 queue bất kể khối lượng công việc. Trong ví dụ ở đây : thì 2 queue là notifications và render sẽ được chia đều các queue worker
- auto : Với sự lụa chọn này thì Horizon sẽ điều chỉnh số lượng các queue 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ác queue worker cho notifications cho đến kho queue notifications không còn job 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 list queue đã đượ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 = AppVideo::find(1); AppJobsRenderVideo::dispatch($video);
Với 1 job như thế này thì horizon sẽ tự động gán tag AppVideo: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.
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ó
https://mattstauffer.co/blog/introducing-laravel-horizon-a-dashboard-for-your-queues/ https://laravel.com/docs/5.5/horizon