Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

ว่าง ๆ มาปรับปรุงการทำงานของ Spring Boot ให้เร็วขึ้น

$
0
0

ปัญหาที่พบเจอในการทดสอบระบบที่พัฒนาด้วย Spring Boot

เมื่อเริ่มเขียนชุดการทดสอบของระบบที่พัฒนาด้วย Spring Boot นั้น ชีวิตก็จะสบายขึ้นมาเยอะ เนื่องจาก Spring Boot ได้เตรียม Spring Boot Unit test หรือ Integration test มาให้อยู่แล้ว แต่ขั้นตอนการทำงานภายในนั้น มันจะทำการสร้าง context ขึ้นมาทุกครั้ง ดังนั้นผลที่ตามมาคือ "ความช้า" และนี่แหละคือปัญหาที่ต้องเจอ จะแก้ไขหรือปรับปรุงอย่างไร เพื่อให้ทำการทดสอบได้รวดเร็วขึ้น

การแก้ไขในเบื้องต้นนั้น

จะพยายามเขียน Spring Boot Unit test (Slice testing) เท่าที่จำเป็นเท่านั้น ส่วนเรื่องอื่น ๆ ในการ mock ด้วย Mockito กับ JUnit มาช่วย ซึ่งทำการทดสอบได้อย่างรวดเร็ว แต่ไม่การันตีว่า ระบบจะสามารถทำงานได้ เนื่องจากเป็นการทดสอบส่วนย่อย ๆ เท่านั้น

มาหาต้นเหตุของปัญหา

เมื่อใช้งาน Spring Boot Unit test แล้ว ก็จำเป็นต้องรู้การทำงานภายในของมันหน่อย ง่าย ๆ ก็แค่ debug เท่านั้นเอง [code] $mvn test -Ddebug [/code] เนื่องจากเรามักจะใช้ @SpringBootApplication, @EnableAutoConfiguration และ @ComponentScan ผลที่ได้คือ Spring Boot มัน load class ต่าง ๆ เยอะมากจนน่าเกลียด ทั้ง class ที่ใช้งานและไม่ได้ใช้งาน นี่คือต้นเหตุของปัญหา [gist id="67cabf0589b54bf798b8563a9a6c4e88" file="1.log"]

การแก้ไขปัญหา

ก็ให้ทำการ load class เท่าที่จะใช้งาน ซึ่งไม่ง่ายเลยเพราะว่า มันเยอะมาก ๆ แต่ก็สามารถทำได้ด้วยการใช้ @Import เอง โดย class ต่าง ๆ ก็เอามาจาก log จากด้านบนนั่นเอง จากนั้นก็เลือกที่เราคิดว่า ต้องการใช้งาน แล้วทำการทดสอบใหม่อีกครั้ง ถ้าทำงานได้เช่นเดิมก็รอดตัวไป ยกตัวอย่างเช่น [gist id="67cabf0589b54bf798b8563a9a6c4e88" file="DemoApplication.java"] จากการใช้งานนั้น โดยปกติจะใช้เวลาในการทดสอบประมาณ 1 นาที เมื่อเปลี่ยนวิธีการตามข้างบนพบว่า เวลาเหลือเพียง 20 วินาที โดยที่วิธีการนี้ใช้ได้ทั้งระบบงานหลักและการทดสอบ มั่นใจได้ว่า เร็วขึ้นแน่นอน อีกอย่างที่น่าสนใจคือ โดยปกติแล้วนั้น Spring Boot ใช้ Apache Tomcat ต้องการใช้ Memory Heap ประมาณ 100 MB และมี Thread มากว่า 15 ตัว ใหญ่น่าดู ดังนั้นเราสามารถทำงาน exclude Apache Tomcat ออกไป แล้วใช้งาน Jetty หรือ Undertow แทน ก็จะดีขึ้นไปอีก
สุดท้ายแล้ว Spring Boot ถูกออกแบบมาสำหรับการทำ Service เล็ก ๆ หรือ Microservices ดังนั้นขนาดของ Service เราเป็นอย่างไร ? ตรงนี้น่าคิดมาก ๆ
ขอให้สนุกกับการ coding ครับ

Viewing all articles
Browse latest Browse all 1997

Trending Articles