thanhhx-zinza / training_social_network

0 stars 0 forks source link

Job and Queue #56

Open thanhhx-zinza opened 2 years ago

thanhhx-zinza commented 2 years ago

TODO

laivanvo commented 2 years ago

I. Bài toán thực tế 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 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.

Việc gửi 200 email là một tác vụ lớn, 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ì chỉ mất 1 giây để gửi 200 email.

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

Queue trong Laravel 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, 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.

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 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.

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;