Em chào anh Dũng và mọi người ạ!
Dạo gần đây em đang đọc phần về CompletableFuture trong cuốn Modern Java In Action. Sau khi tìm hiểu thì em thấy CompletableFuture khá hữu ích với các tác vụ liên quan đến I/O, chẳng hạn như gọi API từ các hệ thống bên ngoài.
Ví dụ, nếu cần gọi đồng thời hai API thì có thể viết như sau:
CompletableFuture<String> future1 =
CompletableFuture.supplyAsync(api::callApi1);
CompletableFuture<String> future2 =
CompletableFuture.supplyAsync(api::callApi2);
Theo cách hiểu của em, callApi1() và callApi2() sẽ được thực thi song song trên các thread khác. Nhờ vậy, thread xử lý request không phải chờ từng API hoàn thành rồi mới gọi API tiếp theo, nên tổng thời gian phản hồi có thể được rút ngắn đáng kể.
Tuy nhiên, em cũng nghĩ rằng cách này cần quản lý thread cẩn thận, chẳng hạn sử dụng thread pool phù hợp. Nếu mỗi request đều tạo quá nhiều thread mới thì có thể gây lãng phí tài nguyên, thậm chí ảnh hưởng đến hiệu năng hoặc độ ổn định của server.
Em có một vài thắc mắc muốn xin ý kiến mọi người:
- Trong thực tế, CompletableFuture có được sử dụng nhiều để xử lý các tác vụ I/O như thế này không? Các dự án production có áp dụng phổ biến không ạ?
- Khi sử dụng CompletableFuture thì thường sẽ phải đánh đổi những gì? Hiện tại em mới thấy khá nhiều lợi ích nên muốn nghe thêm góc nhìn từ mọi người.
- Theo kinh nghiệm của anh Dũng và mọi người thì ưu điểm, nhược điểm và những lưu ý quan trọng khi áp dụng CompletableFuture trong thực tế là gì ạ?
Em cảm ơn anh Dũng và mọi người!