So sánh Tomcat, Jetty và Undertow trong Spring Boot

Spring boot cho phép chúng ta xây dựng các ứng dụng web dễ dàng và có thể sử dụng 3 embedded servlet container phổ biến nhất hiện có: Tomcat, Undertow, và Jetty.

Trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng 3 embedded servlet container trong một project spring boot.

Dependencies

Trong một ứng dụng web sử dụng Spring boot chúng ta luôn cần phải khai báo spring-boot-starter-web dependency trong file pom.xml. Ngoài ra spring-boot-starter-parent là dependency là dependency mặc định trong các project Spring boot.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Tomcat

Đối với Tomcat chúng ta không cần thêm bất kỳ một dependency nào nữa vì mặc định nó đã được chỉ định trong spring-boot-starter-web.

Jetty

Để sử dụng Jetty thay vì Tomcat như mặc định chúng ta cần loại bỏ spring-boot-starter-tomcat ra khỏi spring-boot-starter-web và thêm pring-boot-starter-jetty dependency vào file pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Undertow

Tương tự Jetty, chúng ta sẽ có spring-boot-starter-undertow dependency để sử dụng.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

So sánh performance giữa Tomcat, Jetty và Undertow

Kết quả benchmark cho thấy Undertow cho hiệu năng tốt nhất kế đến là Jetty và kém nhất là Tomcat.

Metric Tomcat Jetty Undertow
jvm.memory.used (MB) 168 155 164
jvm.classes.loaded 9869 9784 9787
jvm.threads.live 25 17 19
Requests per second 1542 1627 1650
Average time per request (ms) 6.483 6.148 6.059

Lưu ý là các chỉ số này chỉ được thực hiện trên các ứng dụng đơn giản, đối với các ứng dụng phức tạp có thể kết quả này sẽ khác.

Tóm lược

Như vậy là chúng ta đã so sánh giữa 3 embedded servlet container phổ biến nhất hiện có: Tomcat, Undertow, và Jetty. Trong đó Undertow có hiệu năng tốt nhất. Tuy nhiên Tomcat vẫn là container phổ biến nhất và được sử dụng mặc định bởi Spring boot. Nếu không có quá nhiều nhu cầu về hiệu xuất hoặc đang trong quá trình tìm hiểu về Spring boot thì các bạn nên bỏ qua vấn đề này.

0 0 votes
Article Rating
Subscribe
Notify of
guest
1 Comment
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
1
0
Would love your thoughts, please comment.x
()
x