intensive tasks tasks tốn thời gian

Solutions để handle những intensive tasks / tasks tốn thời gian

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

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook