본문 바로가기
dev/spring

Spring Framework - Runtime efficiency with String (today and tomorrow)

by igooo 2024. 6. 2.
728x90

개요

Spring Framework 6.1 and Spring Boot 3.2에서 애플리케이션 런타임을 최적화(optimize the runtime effieciency) 할 수 있도록 Spring 에서 제공하는것.

  • Spring MVC as a lean Virtual Threads web stack on JDK 21 (JDK 가상 스레드)
  • Optimized container deployment with Spring and GraalVM Native Image (GraalVM Native Image를 사용한 컨테이너 배포)
  • JVM Checkpoint Restore: Scale to zero with Spring and Project CRaC (JVM 체크 포인트 복원)
  • A glimpse into OpenJDK’s future with Spring AOT and Project Leyden (Spring AOT와 Project Leyden을 통한 OpenJDK의 미래)

Context

클라우드 워크로드의 런타임 효율성 향상에 관심을 가져야 하는 이유는 바로 비용 최적화다.

Spring 팀은 Spring 애플리케이션에 필요한 변경 사항을 최소화하면서 최적화를 지원하는 것을 목표로한다.

요구사항 : Java 17, Spring boot 3, Spring Framework 6

 

Spring MVC as lean Virtual Threads web stack on JDK 21

Java 21부터 사용할 수 있는 Virtual Thread를 사용하여, thread-per-request 스타일로 작성된 서버 애플리케이션의 비용을 줄인다.

Virtural Thread는 I/O 블럭킹을 저렴하게 만들어 Servlet stack의 Spring Web MVC 애클리케이션에 이상적이고, 대부분의 사례에서 코드 변경이나 스레드 풀 구성을 조정하지 않고 최적의 성능을 제공한다.

RestTempalte과 반응형 WebClient 중에 선택해서 사용해야겠지만 Spring Framework 6.1에서 Virtual Thread에 친화적인 RestClient를 도입하기로 했다.

 

WebFlux와 reactive stack의 의미?

애플리케이션 성격에 맞춰서 사용하면된다.

Spring MVC는 선택적 reactive를 지원함으로 둘중 하나를 선택 할 필요는 없다.

 

Optimized container deployment with Spring and GraalVM Native Image

GraalVM 네이티브 지원을 계속하고 있으며 Spring AOT를(Ahead of Time) 사용하여 최적화된 컨테이너 이미지를 구축한다. (JVM 배포가 필요하지 않다.)

빠른 애플리케이션 시작과 즉시 최고 성능으로(JVM은 Just-in-time으로 최적화) 사용할 수 있으므로, Spring Boot native application은 0(zero)로 스케일 할 수 있다.

 

Scale To zero

Scale to zeo는 일종의 서버리스 일반화다. 처리 요청이 없을 때 0으로 활장할 수 있는 기능을 제공하는 모든 kubernates 또는 클라우드 플랫폼에 배포될 수 있다.

0으로 스케일링하는 다양한 사례가 있다. 항상 사용되지 않는 소규모 백오피스 애클리케이션, 짧은 시간 동안만 작동하는 스테이징 환경, 캐싱을 통해 일부를 종료할 수 있는 마이크로 서비스 등은 0으로 스케일 할 수 있다. (0으로 스케일 하지 않으면 사용하지 않는 리소스에 대하여 비용을 지불해야한다.) 애플리케이션 시작 시간이 너무 길어서 위험으로부터 복구 할 수 없기 때문에 긴급 상황에 대비하야 각 서비스에 2개 이상의 인스턴스를 유지해야 하는 고가용성도 잊지 말아야한다.

 

하지만 GraalVM Native Image에 필요한 절충안을 수용할 수 없는 프로젝트를 0으로 스케일 하는 방법은?

 

JVM Checkopint Restore: Scale to zero with Spring and Proejct CRaC

CraC는 Azul System에서 개발하고, HotSpot JVM에서 애플리케이션을 checkopint and restore 할 수 있도록 새로운 Java API를 정의하는 OpenJDK project 입니다. 이는 Linux에서 체크포인트/복원 기능을 구현하는 프로젝트인 CRUI를 기반으로 한다

The priciple is the folloging:

  • CRaC 사용가능한 JDK로 애플리케이션을 시작한다.
  • 애플리케이션 실행 후 모든 모드 경로를 실행하여 JVM을 핫하게 만드는 워크로드 후 (애플리케이션의 모든 기능을 실행)
  • API 호출, jcmd 명령, HTTP 엔드포인트 또는 다른 기능을 사용하여 checkpoint를 트리거링한다.
  • 실행중인 JVM의 memory representation와 includinf its warmness가 디스크에 직렬화되면
  • 비슷한 운영체제, CPU 아키텍처의 다른 머신에서 바르게 복원 할 수 있고, 복원된 프로세스는 런타임 시 추가 JIT 최적화를 포함하여 HotSpot JVM의 모든 기능을 유지한다.

"Checkpoint" And "Restore"가 Spring application context 라이프 사이클 정지, 시작 단계와 매우 일치한다.

Spring Framework 6.1 CRaC지원은 주로 CRaC와 Spring 라이브 사이클을 함께 매핑하는 것이고, 나머지 지원은 CRaC에 묶여 있지 않으며 주로 소켓, 파일, 및 풀을 적정하게 닫고 재생성하도록 설계된 Spring 라이프 사이클 개선에 관한것이다.

GraalVM 과 마찬가지로 Proejct CRaC를 사용하면 소규모 서버에서도 수십 밀리초의 즉각적인 시작으로 애플리케이션을 0으로 스케일할 수 있다. 이는 일반 JVM 콜드 스타트보다 50배 이상 빠르며 GraalVM 기본 이미지와 유사하다.

 

A glimpse into OpenJDK’s future with Spring AOT and Project Leyden

"premain" 최적화는 아직은 실험적인 기능이지만, JVM과 Project Leyden의 최적화는 트레이드 오프가 거의 없지만 더 빠른 워밍업을 제공한다. (아직은 0으로 스케일링 할 수 없다.)

 

참고

https://spring.io./blog/2023/10/16/runtime-efficiency-with-spring

'dev > spring' 카테고리의 다른 글

REST Assured로 API 테스트하기  (0) 2024.06.03
Spring - Modulith  (0) 2024.06.03
Ehcache Annotations for Spring  (0) 2010.08.05
HiddenHttpMethodFilter  (0) 2010.06.24
Maven Build Script (spring + hibernate)  (0) 2009.12.07