- vừa được xem lúc

Virtual Threads: Nền tảng mới cho ứng dụng Java quy mô lớn

0 0 19

Người đăng: Blue Screen of Death

Theo Viblo Asia

Virtual threads là một dự án tham vọng trên nền tảng Java, được kì vọng sẽ cải thiện đáng kể cho các ứng dụng tải cao và là một trong những thay đổi lớn của kiến trúc JVM sau một thời gian dài. Những kì vọng với virtual threads trong Java 19 sẽ có trong bài viết này.

Một trong những cập nhật đáng chú ý của Java 19 chính là sự ra mắt của virtual thread. Đây được đánh giá là nền tảng mới cho ứng dụng Java quy mô lớn, hứa hẹn sẽ cải thiện hiệu năng cho các hệ thống tải lớn dựa trên Java, đặc biệt là các hệ thống cần xử lý song song nhiều.

Giải thích nhanh về Thread và Virtual Thread

Trong kiến trúc máy tính, thread (luồng) là phần con của process (tiến trình). Thread được tạo ra và quản lý thời gian xử lý bởi hệ điều hành.

Ngược lại, virtual thread (luồng ảo) là thread được tạo và quản lý bởi một platform thay vì được tạo và quản lý bởi hệ điều hành như thread thông thường. Một ví dụ điển hình nhất của virtual thread là goroutine của Golang.

Mới đây Java cũng đã cung cấp khả năng tạo virtual thread bằng JEP 425 trong JDK 19 với mã dự án Project Loom.

Do virtual thread được tạo ra bởi platform nên về lý thuyết platform có thể tạo ra số lượng virtual thread gần như vô tận, không bị giới hạn bởi số lượng thread của hệ điều hành. Ngoài ra tạo virtual thread cũng tốn ít tài nguyên hệ thống hơn thread thông thường nhiều lần, giúp cho việc tạo và quản lý virtual thread trở nên dễ dàng hơn.

Bảng dưới đây so sánh sự khác nhau về thread và virtual thread:

Threads Virtual Threads
Được tạo ra và quản lý bởi hệ điều hành Được tạo ra và quản lý bởi platform
Tốn nhiều tài nguyên Tốn ít tài nguyên
Khó quản lý Dễ quản lý
Số lượng ít Số lượng nhiều

Phần tiếp theo ta sẽ tìm hiểu cách sử dụng tính năng virtual thread trong Java 19.

Sử dụng Virtual Threads trong Java

Đầu tiên, ta cần cài đặt JDK 19 từ Oracle hoặc OpenJDK.

Sau khi cài đặt JDK19 thành công, ta tạo file App.java như sau để test tính năng tạo virtual thread.

public class App { public static void main( String[] args ) { Random random = new Random(); Runnable runnable = () -> { double i = random.nextDouble(1000) % random.nextDouble(1000); }; int numThread = 100000; long start = System.currentTimeMillis(); for (int i = 0; i < numThread; i++) { Thread.startVirtualThread(runnable); } long finish = System.currentTimeMillis(); long timeElapsed = finish - start; System.out.println("Run time with virtual thread: " + timeElapsed); start = System.currentTimeMillis(); for (int i = 0; i < numThread; i++) { Thread t = new Thread(runnable); t.start(); } finish = System.currentTimeMillis(); timeElapsed = finish - start; System.out.println("Run time without virtual thread: " + timeElapsed); }
}

Do tính năng virtual thread còn đang ở mức preview nên cần chạy command java với option --enable-preview như sau:

java --source 19 --enable-preview ./App.java

Cấu hình máy test sử dụng windows 11 với CPU i7 8750H và 16GB RAM. Kết quả chạy như sau:

Run time with virtual thread: 488
Run time without virtual thread: 16652

Như ta thấy, trong Java việc sử dụng virtual thread hiệu quả hơn thread thường lên đến hơn 30 lần.

Một số vấn đề cần lưu ý

Việc tạo ra một virtual thread rất nhanh và hiệu quả so với thread thông thường, tuy nhiên hiệu suất tính toán trên virtual thread cũng chỉ tương đương trên thread thường. Vì vậy, sử dụng virtual thread chỉ có lợi khi chúng ta cần tạo ra một lượng lớn thread để làm các công việc ít tốn hiệu năng CPU, ví dụ như xử lý network, đọc/ghi file, truy vấn cơ sở dữ liệu. Việc sử dụng virtual thread cũng giúp hệ thống có thể vượt qua số lượng thread tối đa của hệ điều hành, vốn bị giới hạn bởi cấu hình phần cứng.

Hiện tại thì virtual thread trên Java vẫn chỉ là bản preview nên cần kích hoạt bằng option --enable-preview.

Kết luận

Virtual thread trong Java là một tính năng rất hữu ích, hứa hẹn sẽ đem lại nhiều thay đổi trong việc thiết kế và xây dựng các hệ thống dựa trên Java, đặc biệt là các hệ thống cần xử lý song song nhiều. Hiện tại một số dự án lớn trong hệ sinh thái Java đã bắt đầu sử dụng virtual thread như Quarkus, Tomcat, Helidon, ...

Link tham khảo

Java Virtual Threads

Intro to virtual threads

How to use Java 19: Virtual Threads

Virtual thread performance gain for Microservices

Bình luận

Bài viết tương tự

- vừa được xem lúc

Performance Optimization 104: Trinh sát ứng dụng với monitoring

Con đường trở thành thám tử chuyên nghiệp của chàng developer. Nếu bạn yêu ứng dụng của mình thì chỉ có cách cần trô thật chặt, thật kinh khủng, thật mất tự do vào.

0 0 57

- vừa được xem lúc

Performance Optimization 101: Những câu hỏi cơ bản

Definitive guide for performance engineer. API của bạn có thời gian phản hồi quá lâu. Hay hoá đơn cloud đập vào mặt bạn những con số quá kinh khủng dùng mới chỉ có một nhúm người dùng. HÃY ĐỌC TIẾP, BÀI VIẾT NÀY LÀ DÀNH CHO BẠN.

0 0 63

- vừa được xem lúc

Performance Optimization 105: Database bottleneck - Đuổi bắt kẻ tội đồ

Hành trình đuổi bắt giáo sư Moriarty của thế giới bottleneck: database. Cuộc chiến không hồi kết này rút cục sẽ ra sao? Liệu mọi chuyện có kết thúc tại thác Reichenback không hay Moriarty sẽ mãi là bóng ma ám ảnh service của chúng ta mãi.

0 0 58

- vừa được xem lúc

Caching đại pháp 3: Vấn đề và cách giải quyết

Vấn đề không tự sinh ra cũng không tự mất đi, nó chỉ chuyển từ dạng này sang dạng khác, hoặc từ chỗ này sang chỗ khác. Đó là cách mọi thứ hoạt động.

0 0 128

- vừa được xem lúc

Tối ưu SQL - Join - Where (Phần 1)

Đây là vấn đề mình gặp trong quá trình làm việc, viết vào đây vừa để note lại cho bản thân, vừa chia sẻ với mọi người. users(id, name), 10tr bản ghi.

0 0 47

- vừa được xem lúc

Tối ưu SQL - Subqueries Count Distinct (Phần 2)

Tiếp theo bài 1 về tối ưu performance. . dashboards(id, name). .

0 0 44