Tìm hiểu về Queue trong Laravel

196

I. Bài toán thực tế

Quang là một developer làm việc trong một công ty quảng cáo. Lần này anh được giao nhiệm vụ cải tiến tool gửi email marketing của công ty sao cho chạy nhanh hơn, hiệu quả hơn. Hiện tại tool này gửi càng nhiều email thì lại càng tốn thời gian để thực hiện, trung bình mỗi email gửi mất 1 giây, trong khi mỗi lần gửi thường gửi không dưới 200 email. Dẫn tới việc phải chờ đợi quá lâu, gây ức chế cho người sử dụng, mà hiệu quả công việc lại không cao.

II. Queue chính là giải pháp

Tool gửi email của công ty được xây dựng trên Laravel 5.5.

Vốn chưa có nhiều kinh nghiệm trong việc xử lý bài toán như trên, anh Quang đành lặn lội lên mạng tìm giải pháp. Tìm hiểu một lúc, anh thấy người ta nói nên sử dụng Queue, và việc sử dụng Queue để gửi email sẽ nhanh chóng và hiệu quả hơn là gửi email theo cách thông thường. Chính xác là cái anh đang cần, không ngần ngại, anh tiếp tục tìm hiểu sâu hơn xem Queue trong Laravel là cái gì?

Hồi sau anh có thể kết luận nhanh

Queue trong Laravel là giải pháp giúp chia một tác vụ lớn thành nhiều tác vụ nhỏ độc lập, để mỗi tác vụ nhỏ này có thể thực hiện song song, hoặc gần như song song.

Từ kết luận trên, anh coi việc gửi 200 email là một tác vụ lớn, và chia tác vụ này thành 200 tác vụ nhỏ – mỗi tác vụ nhỏ gửi 1 email. Vậy trong trường hợp 200 tác vụ nhỏ được thực hiện cùng lúc, thì anh chỉ 1 giây để gửi 200 email.

Về lý thuyết sẽ là vậy, nhưng thực tế thế nào thì thay mặt anh Quang mình sẽ gửi tới bạn một bài so sánh chi tiết giữa việc gửi mail sử dụng Queuegửi mail không sử dụng Queue sau. Còn bây giờ chúng ta sẽ cùng nhau tìm hiểu kỹ hơn về Queue trong Laravel là gì nhé.

III. Queue là gì và cách hoạt động của Queue

Như anh Quang kết luận nhanh, Queue là cách chia một tác vụ lớn thành nhiều tác nhỏ hơn, sau đó cho các tác vụ nhỏ này cùng thực hiện song song. Thực ra, đó không phải là tính năng của Queue, mà nó chỉ là một trong những ứng dụng của Queue thôi.

Queue trong Laravel thực chất là một hàng đợi chứa các tác vụ cần xử lý, tác vụ nào đưa vào trước sẽ được xử lý trước, tác vụ nào đưa vào sau sẽ được xử lý sau. Và quan trọng nhất là Queue trong Laravel có thể chạy ngầm.

Chạy ngầm ở đây tức là nó không yêu cầu user phải đợi. Quay trở lại bài toán của anh Quang, ban đầu để gửi 200 email, người dùng phải đợi 200 giây để hệ thống thực hiện gửi lần lượt từng email một. Tức là sau 200 giây, người dùng mới nhận được phản hồi từ hệ thống. Nhưng khi áp dụng Queue, người dùng chỉ mất 1 giây là nhận được phản hồi ngay. Tuy nhiên lúc người dùng nhận được phản hồi, thì hệ thống chưa hề thực hiện các tác vụ gửi mail, mà chúng mới chỉ được đưa vào Queue (hàng đợi), và trong trạng thái sẵn sàng để gửi.

Để hình dung rõ hơn, mình có thể mô tả cách hoạt động của hệ thống khi sử dụng Queue thành các bước như sau:

  • Bước 1: Hệ thống nhận yêu cầu phải gửi 200 email
  • Bước 2: Hệ thống tạo ra 200 tác vụ con và đưa vào chúng lần lượt Queue
  • Bước 3: Hệ thống thông báo tới người dùng là đã gửi email thành công
  • Bước 4: 200 tác vụ con trong Queue lần lượt được thực hiện ngầm

Với các bước thực hiện như trên, ngay tại Bước 3 người dùng đã nhận được thông báo gửi thành công, với họ như vậy là viên mãn. Còn việc thực hiện 200 tác vụ đã được đưa vào hàng đợi sẽ được thực hiện sau.

IV. Tại sao lại sử dụng queue và nên sử dụng queue khi nào?

Các tác vụ được xử lý bằng Queue có một vài ưu điểm như sau:

  • Do các tác vụ có thể chạy ngầm, và chạy sau khi hệ thống đã phản hồi, nên không yêu cầu user phải đợi lâu.
  • Chỉ khi hệ thống rỗi, các tác vụ trong Queue mới được thực hiện, điều này giúp dự án của bạn chạy mượt mà hơn trong các giờ cao điểm.

Mỗi ưu điểm trên, là một lý do khiến chúng ta nên sử dụng queue trong dự án. Vậy khi nào nên sử dụng Queue? Có phải cái gì bỏ vào Queue cũng tốt không? Đương nhiên là không rồi, cái gì quá cũng không tốt mà. Chúng ta nên sử dụng Queue khi mà:

  • Các tác vụ chạy độc lập, không liên quan tới nhau.
  • Tác vụ tốn nhiều thời gian để thực hiện, như việc gửi mail, backup dữ liệu.
  • Tác vụ không cần phải phàn hồi ngay, thậm chí có thể trì hoãn 1, 2 phút mà không làm ảnh hưởng tới người dùng.

V. Cách sử dụng queue trong Laravel

5.1 Tích hợp queue trong dự án laravel

Queue là một trong những thành phần của Laravel, vì vậy mà sử dụng Queue trong Laravel vô cùng đơn giản.

Bước 1: Mở file .env tìm dòng QUEUE_DRIVER=syncđổi thành

QUEUE_DRIVER=database

Bước 2: Thực hiện lần lượt các command sau

php artisan queue:table # Sẽ tạo ra các migrations mới liên quan tới queue
php artisan migrate # Migrate các migrations mới tạo ra

Bước 3: Chạy command sau thực hiện các tác vụ có trong Queue

php artisan queue:work

Command trên chỉ tiện lợi khi chúng ta chạy trên local. Còn khi deploy thì tùy vào hệ điều hành chúng ta sẽ có cách khác nhau để thay thế.

5.2 Đưa tác vụ (Job) vào Queue

Queue đã sẵn sàng để hoạt động, giờ chúng ta sẽ tạo các tác vụ rồi đưa chúng vào Queue để xem nó hoạt động như thế nào nhé.

Trong Laravel, mỗi một tác vụ trong Queue thì được gọi là 1 Job. Để tạo ra 1 Job, chúng ta sẽ sử dụng command

php artisan make:job TenJob

Để đưa Job vào Queue, trước tiên chúng ta cần phải khởi tạo Job trước rồi sử dụng hàm dispatch() để đưa vào;

<?php

$job = new TenJob(); # Khởi tạo job
dispatch($job); # đưa job vào queue

Rất đơn giản phải không nào.

VI. Kết luận

Các Laravel developer thì chắc hẳn ai cũng nghe qua về Queue, nhưng không phải ai cũng hiểu rõ về nó. Như mình đây, lúc mới tìm hiểu về Laravel, cũng nghe qua tới Queue, cũng biết rằng nó hay dùng để gửi mail, cũng biết rằng nó sẽ làm tăng trải nghiệm người dùng, thế nhưng do không được làm việc với các dự án thực tế, nên không cảm nhận được sử khác biệt khi sử dụng Queue và không sử dụng Queue trong dự án. Sau này được tham gia làm dự án có hàng trăm nghìn user, mình mới “thấm đượm” về thằng Queue này.

Tới đây là kết thúc phần 1. Ở phần này, mình hy vọng các bạn đã hiểu rõ về Queue trong Laravel là gì, cách hoạt động của Queue cũng như tạo sao và khi nào chúng ta sử dụng Queue trong dự án.

Ở phần tới, mình sẽ hướng dẫn các bạn cách gửi email sử dụng Queue. Nhớ tìm phần 2 để đọc tiếp nhé.

Chào tạm biệt.


Phần tiếp theo đã có mặt ở đây: Gửi mail bằng Queue trong Laravel