Hi các bạn,
Làm việc với backend, sẽ có những lúc ta sẽ viết những tasks mà nó tốn kha khá thời gian để xử lý (cho dù đã optimized nhất có thể).
Vậy nên, ta sẽ có nhiều solutions khác nhau để giải quyết. Và đây cũng là 1 trong những câu hỏi mà interviewers hay hỏi tới các bạn.
Let’s game.
1/ Những tasks consider là tốn thời gian / intensive tasks
Mình ví dụ vài cái cơ bản nhé:
- Những cái tính toán phức tạp (có thể)
- Gửi email (100% tốn tầm 3-5s cho 1 cái email khi gửi thông qua SMTP)
- Gửi bulk emails thì cứ nhân lên đi nhóe, vd 300 người (300 x 3 = 900s = 15m :o)
- Những tác vụ mà bạn call 3rd APIs, nó cũng takes time kha khá
- …
Nếu 1 task mà nó tốn khoản 500ms đến vài giây / request, consider tốn thời gian. Và nếu ta để vậy thì nó sẽ bị:
- Blocking main thread
- Nhất là những bạn xài NodeJS – 1 thread only – điều này sẽ ko tốt và sẽ block cả application
- Chậm và nó sẽ cho ng` dùng 1 cái cảm giác bad experience.
- Đôi khi chúng ta setup timeout tầm 30 ~ 60s. Mà handle quá thời gian đó sẽ bị timeout và process sẽ bị dừng lại ở middle of nowhere, ko bik đường mà track
Vậy nên, cùng nhau qua các giải pháp xử lý nhé
2/ Solutions để giải quyết bài toán này
Task Scheduler
Đây là 1 cách rất hay, thông qua Cron Job. Chúng ta sẽ save lại cái task qua DB hay Redis/Cache, rồi sau đó để Cron Job Task pick ra và xử lý giúp chúng ta
Pros:
- Không lo bị blocking, mọi tasks tốn time sẽ dc xử lý sau, trả về liền kq cho users.
- Tasks xử lý dưới background và ko có timeout
Cons:
- Phải develop 1 cách thông báo cho users
- Ví dụ, khi submit task => thông báo đang process => check => thông báo đã processed. Ở đây có 1 số cách để các bạn tham khảo:
- Websocket để thông báo
- setTimeout mỗi 5s request lên check 1 lần
- Ví dụ, khi submit task => thông báo đang process => check => thông báo đã processed. Ở đây có 1 số cách để các bạn tham khảo:
- Tasks chỉ dc xử lý 1p/lần (limitation của cron task * * * * * *)
Queue
Cũng hơi hơi tương tự như Cron Task, ta sẽ dùng Message Queue và đá qua 1 service khác để xử lý giúp. Sau đó đợi service đó trả về kết quả và ta lại báo kết quả cho clients
Pros và Cons cũng tương tự như Task Scheduler, nhưng sẽ đặc biệt hơn là: khi nhận dc message, service kia sẽ thực thi ngay lập tức chứ ko đợi 1p / lần như cron task.
New Thread / Worker Thread
Qua tới phần này thì PHP hết có cửa =)). Tuy nhiên đối với các lang như Java, C# (Thread) hoặc NodeJS (Worker Thread). Ta có thể sử dụng cách này.
Chỉ đơn thuần là tạo 1 thread/worker thread mới và để nó xử lý riêng, tránh xa cái main thread hiện tại. Về flow hoạt động thì nó cũng như 2 thằng trên, độc lập, tự chủ.
Cách này cũng khá hay vì ta có thể solving dc ngay tại service hiện tại. Pro/Cons tương tự như Queue.
3/ Conclusions
Như trên là 1 số cách khá phổ biến khi ta gặp vấn đề này. Cũng như nếu bị hỏi trong lúc phỏng vấn haha.
Thanks for reading.