beaniejoy / dongne-cafe-api

☕️ kotlin & spring boot application (toy project) / siren order service for local cafe
2 stars 1 forks source link

Jenkins 이용한 배포 프로세스 구축 (2) #50

Closed beaniejoy closed 1 year ago

beaniejoy commented 1 year ago

Jenkins 이용한 배포 프로세스 구축 (1) 이어서 진행

지금은 단순 중단 배포 방식으로 적용
(추후 무중단 배포 방식 적용할 것)

beaniejoy commented 1 year ago

애플리케이션 실행 Bash Script

kill process

Spring Boot Test

@RestController
class TestController {
    companion object: KLogging()

    @GetMapping("/test")
    fun test(): ApplicationResponse<String> {
        logger.info { "start!!!!" }
        Thread.sleep(10 * 1000)
        logger.info { "end!!!!" }
        return ApplicationResponse.success().data("test")
    }
}

위와 같이 설정후 애플리케이션 실행 > GET 요청 중 kill -9, kill -15 비교

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

요청 처리 중임에도 즉시 종료(SIGKILL)

- kill -15

java.lang.InterruptedException: sleep interrupted at java.base/java.lang.Thread.sleep(Native Method) at io.beaniejoy.dongnecafe.domain.cafe.controller.TestController.test(TestController.kt:15) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ...

org.apache.catalina.connector.ClientAbortException: java.nio.channels.ClosedChannelException at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353) at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:783) ...


sleep에 대한 interrupt 발생해서 `InterruptedException` 예외 발생  
**요청 보낸 client 입장에서 아무런 응답을 받지 못함**  
([ClientAbortException 관련 내용](https://perfectacle.github.io/2022/03/20/client-abort-exception-deep-dive-part-01/))  
spring boot 기본 tomcat shutdown 방식은 `immediate`로 되어 있음  
> `-TERM`: 프로세스를 종료시키기전에 시그널에 대한 handling하는 코드 적용 가능  
> immediate 방식은 종료 전 수행하는 handler가 없이 바로 종료라서 그런 것인지???

### Spring graceful shutdown
```yaml
# application.yml
spring:
  lifecycle:
    timeout-per-shutdown-phase: 35s # 기본값은 30s 이다.
server:
  shutdown: graceful

이렇게 적용하고 kill -TERM 방식으로 종료하면 응답을 건네주고 애플리케이션을 종료