Thông thường khi ASP.NET nhận một request, ít sẽ cấp phát một thread trong thread pool. Thread này sẽ bị chiếm bởi request cho đến khi một request sẵn sàng và được gửi đến người gọi.
Thread trong process này không thể dùng cho request khác.
Điều này gây ra một số limitation:
- Process cho 1 request: 200ms = 0,2 giây
- Suy ra, ASP.NET có thể xử lý 5 request / giây.
- Nếu giới hạn 10 threads trong thread pool, thì có thể xử lý 50 requests / giây
Nếu giới hạn là 1000 worker threads trong thread pool, thì có thể xử lý đến 5000 requests/ giây. Nhưng để nó chạy được như vậy, không hề đơn giản.
ASP.NET Async Action
Mục đích của async action là để chia sẻ các worker threads giữa các requests.
Khi phải gọi đến external resource như là database hoặc webservice và chờ kết quả trả về để response cho caller. Nếu dùng sync action, thì thread hiện tại sẽ bị blocked.
Async action trong trường hợp này trong khi đợi response từ external service, thread sẽ được chia sẻ cho những action khác.
Cụ thể, giả sử: thời gian xử lý cho 1 request là 0,2s.
thread sẽ dùng 0,05s để xử lý bên trong (CPU) và 0,15s để xử lý bên ngoài (I/O).
Nếu dùng sync action, trong 1s, một thread chỉ có thể xử lý 5 request (lấy 1s chia cho 0,2s cho mỗi request).
Nếu dùng async action, khi chờ xử lý bên ngoài 0,15s sẽ được chia sẻ cho request khác. Nên, trong 1s, một thread có thể xử lý 20 request (lấy 1s chia cho 0,05s cho mỗi request).
Nghĩa ra, càng nhiều xử lý bên ngoài tốn time thì ta sẽ được nhiều lợi ích từ việc sử dụng async aciton.
Một số use cases
Một một thread đang thực hiện action mà bị blocked bởi một method trong stacktrace, thread sẽ thông để share cho request khác.
CPU bound: VD xử lý file lớn trong memory, thì sync action sẽ tốt hơn.
I/O bound: ứng dụng như proxy web service, dùng để filter, validate, pass request đi và chờ result từ các service, thì async action sẽ tốt hơn.
Ứng dụng cần khả năng cancelation: bạn gửi 10 request cùng lúc lên ứng dụng và khi nhận được request đầu tiên, bạn không cần dùng đến 9 request còn lại nữa. trogn trường hợp này, async action sẽ phù hợp hơn.
Reference:
https://gokhansengun.com/asp-net-mvc-and-web-api-comparison-of-async-or-sync-actions/