Xử lý đa luồng trong laravel
Em có kết nối realtime lên Firebase. khi em thực thi 1 function thì em có update dữ liệu lên Firebase và chờ dữ liệu update thành công mới trả về message => Rất lâu khoảng 3-5s. Em muốn trả về message trước và update firebase đó sẽ chạy ngầm thì có cách nào không ạ ?.
4 CÂU TRẢ LỜI
Có nhé em, hầu hết các hệ thống web đều có hệ thống queue-job. Và rất may Laravel cũng đã support các chức năng giúp xử lý queue-job giúp mình rồi nha. Khái niệm Queue - tạm hiểu là một hàng đợi, chạy ngầm trên server và độc lập so với main process của web-app. Hệ thống Queue sẽ lấy các job trong cái hàng đợi ra và thực hiện nó.
Các job tốn nhiều thời gian như gửi Mail, Push notification... thì chúng ta sẽ đẩy job đấy vào trong Queue rồi return HTTP Response lại cho người dùng luôn, còn job đấy trong queue sẽ được chạy ngầm trên server.
Em có thể đọc thêm về queue của Laravel ở tài liệu gốc nhé: https://laravel.com/docs/7.x/queues
Cảm ơn ạ. A nghĩ sữ dụng php Mutithreading có được không ạ
@thanhminh1998 Push cái job đó vào queue sẽ dễ dàng scale hơn em ạ. Với cả việc thao tác với queue thì được Laravel support rồi, việc sử dụng sẽ đơn giản hơn nhiều.
Dạ Anh. dạng như thế đó ạ
- Khi update dữ liệu lâu thì bạn thủ xem phần code update có đang bị N + 1 query không hay có phần nào đang xử lý cồng kềnh thì nên refactor lại còn nếu mọi thứ ổn rồi mà thời gian vẫn cao thì bạn có thể tham khảo việc cho vào Queue của laravel nhé https://laravel.com/docs/7.x/queues
- nhưng minh thấy việc trả message trước mà update sau thì không ổn cho lắm vì mình chưa thể nào xác định được là đã update thành công hay không thành công mà đã bắn message ra thì thấy không ổn
Về phần việc update Firebase nên nó chạy chậm. Em đã thử bỏ ra FB thì nó chạy rất nhanh. Cảm ơn Anh
Theo mình thì sử dụng queue job, cho action vào queue chờ đợi chạy https://laravel.com/docs/7.x/queues
Bạn ơi. Có cách nào con queue job nó chạy luôn khi mình thực thi không. Chứ k cần đợi rồi mới chạy không ạ.
@thanhminh1998 về cơ bản nó sẽ chạy ngay khi tài nguyên cho phép. chỉ cần trên server chạy php artisan queue:work bạn ạ