Khi làm việc với Laravel Queue, chắc hẳn bạn đã từng gặp hai phương thức quen thuộc:
dispatch()
dispatch_sync()
Nghe thì na ná nhau, nhưng thực ra cách hoạt động lại khác biệt hoàn toàn. Hiểu đúng sự khác nhau sẽ giúp bạn tối ưu hiệu năng và tránh bug ngớ ngẩn khi xử lý job.
1. dispatch()
: Gửi Job vào hàng đợi
dispatch()
dùng để đưa Job vào hàng đợi (queue). Worker sẽ xử lý nó sau, theo cơ chế bất đồng bộ.
Ví dụ:
SendWelcomeEmail::dispatch($user);
Khi chạy code trên:
- Job
SendWelcomeEmail
không chạy ngay. - Nó sẽ được lưu vào queue (Redis, Database, SQS, RabbitMQ…).
- Worker (chạy bằng lệnh
php artisan queue:work
) sẽ pick nó lên và xử lý. - Request hiện tại không bị chặn, trả về ngay cho user → nhanh và mượt.
👉 Thích hợp cho:
- Gửi email, SMS.
- Xử lý file, video, ảnh.
- Đồng bộ dữ liệu với service khác.
2. dispatch_sync()
: Chạy ngay lập tức
Ngược lại, dispatch_sync()
sẽ bỏ qua queue và chạy Job ngay trong tiến trình hiện tại.
Ví dụ:
WriteAuditLog::dispatchSync($user);
Khi chạy code trên:
- Job
WriteAuditLog
thực thi ngay. - Không cần worker, không cần queue.
- Request sẽ chờ job chạy xong mới tiếp tục.
👉 Thích hợp cho:
- Ghi log quan trọng.
- Tính toán cần kết quả ngay.
- Các tác vụ nhỏ, không tốn nhiều thời gian.
3. Khi nào dùng cái nào?
- Dùng
dispatch()
khi:- Tác vụ nặng.
- Không cần kết quả ngay.
- Bạn muốn tăng tốc request trả về cho user.
- Dùng
dispatch_sync()
khi:- Tác vụ nhỏ, cần chạy ngay.
- Muốn đảm bảo chạy xong trước khi qua bước tiếp theo.
- Không muốn phụ thuộc vào queue worker.
4. Lưu ý
- Trước Laravel 8 có
dispatchNow()
, nhưng đã bị thay thế bởidispatchSync()
. - Nếu bạn dùng
dispatch()
mà không bật queue worker, job sẽ không bao giờ chạy → bug silent rất khó chịu.
5. Kết luận
dispatch()
= chạy bất đồng bộ (qua queue).dispatch_sync()
= chạy đồng bộ, ngay lập tức.
👉 Hãy nhớ:
- Nặng → dispatch.
- Nhẹ & cần ngay → dispatch_sync.
Đơn giản vậy thôi, nhưng áp dụng đúng thì hệ thống Laravel của bạn vừa nhanh hơn, vừa ổn định hơn.