Hàng đợi Queue trong framework laravel

Queue laravel

Trong laravel, Queue - hàng đợi được áp dụng xử lý các tác vụ độc lập, tốn nhiều thời gian cùng việc worker sẽ lắng nghe xử lý tuần tự FIFO các jobs. Ví dụ , bài toán Import CSV với 1 dữ liệu lớn hay yêu cầu gửi số lượng mail tới người dùng trong 1 request việc sử dụng queue để xử ngầm và độc lập tác tác vụ này làm tăng trải nghiệm về mặt người dùng khi không phải chờ đợi toàn bộ quy trình xử lý xong mới thực hiện tiếp được quy trình.

Vậy queue trong laravel có gì mọi người cùng mình tìm hiểu nhé!

1. Phân biệt connection và queues

Trong file cấu hình config/queue.php

  • Connection chứa thông tin kết nối với backend service như Amazon SQS, Beanstalk, hoặc Redis.
    queue
  • Bất kỳ queue connection có thể có nhiều "queues" mà có thể được coi như các stacks khác nhau hoặc các queued jobs và nếu bạn gửi 1 job mà không xác định queue nào gửi đến thì mặc định jobs sẽ được đặt tên là giá trị thuộc tính queue attribute cấu hình trong connection.

2. Queue drive chính

- Database
Thông tin của jobs được lưu trong bảng jobs sau khi run :
php artisan queue:table
php artisan migrate
- Sync
Jobs được xử lý ngay lập tức
- Amazon SQS
Dịch vụ cung cấp bên ngoài cần đăng kí dịch vụ

3. Một số lưu ý

- Cấu hình connection và queues khi gửi jobs

dispatch

onConnection(): khi hệ thống có nhiều task vụ cần xử lý và mong muốn sử dụng đồng thời nhiều backend service khác nhau : database, aws, ...
onQueue(): định nghĩa nhiều queues trong cùng 1 connection tạo sự độc lập trong xử lý task vụ ( 1 queue chết và queue kia không bị ảnh hưởng).

- Độ trễ của job
dispatch-1
Worker lắng nghe và gửi job xử lý sau khoảng thời gian delay.

- Job chaining

job-chain

Thực hiện tuần từ các job và nếu 1 job chết sẽ dừng toàn bộ.

- Ghi log job

event-job

Kiểm tra thông tin tin job tại thời điểm bắt đầu hoặc kết thúc bằng event đăng kí tại AppServiceProvide.php

failed

Sử dụng hàm failed() để xử lý lỗi và ghi log trạng thái lỗi

4. Command line sử dụng chính

- Tạo file job

php artisan make:job nameFileJob

- Run queue

php artisan queue:work -- attribute

Với attribute:

-- tries : xác định tối đa một jobs được thực hiện
-- timeout : thời gian gian tối đa job có thể chạy trong queue
-- queue=name : queue worker lắng nghe
-- once : worker chỉ lắng nghe một job duy nhất
-- sleep : thời gian sleep khi không có job nào trong queue

- Kiểm tra log failed

php artisan queue:failed // danh sách log failed
php artisan queue:retry all / id // chạy lại toàn bộ hoặc 1 log failed cụ thể
php artisan queue:forget id // xóa 1 log failed
php artisan queue:flushed // xóa toàn bộ log failed

5. Cấu hình laravel queue trên môi trường production

- Cài đặt supervisor

**sudo apt-get install supervisor **

- Cấu hình cơ bản supervisor

Thư mục cấu hình : /etc/supervisor/conf.d

1213-1

Với:
program : tên program : mọi người có thể đặt tên bất kỳ gì.
autostart : tiến trình tự động chạy sau khi supervisor khởi động hay không
autorestart : tiến trình tự động khởi động ngay sau khi nó bị tắt
user : user dùng để thực thi tiến trình
numprocs : số lượng tiến trình mà supervisor sẽ chạy
redirect_stderr : nếu là true thì stderr sẽ bị redirect để xuất vào file chỉ định ở stdout_logfile
stdout_logfile : đường dẫn tới file log của mình. File này ko cần tạo trước vì supervisor sẽ tự tạo cho mình

Sau khi cấu hình xong hãy restart supervisor

systemctl restart supervisor

or

sudo service supervisor restart

- Khởi động queue

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start tên program :

Tài liệu tham khảo :

https://levanphu.info/laravel-tim-hieu-ve-queues-phan

https://levanphu.info/laravel-tim-hieu-ve-queues-phan-1

https://laravel.com/docs/8.x/queues

http://supervisord.org/index.html