대머리개발자

지연(delay) 포인트를 찾기는.. 하늘의 별딱. 본문

개발이야기

지연(delay) 포인트를 찾기는.. 하늘의 별딱.

대머리개발자 2025. 9. 8. 15:51

 

10시 정기배치 시간이 되면 어김없이 1-2곳의 end-point가 지연이 발생한다.

 

또한 지연이 발생하는 end-point가 그때그때 달라진다.

 

확실히 어디선가 블록킹이 발생한다는 것인데...찾기가 여간.......

 

"집킨 + 엘라스틱"을 이용해 시간대별 응답값을 히트맵으로 그려 놓은 차트이다.

10시에 "하나 혹은 두개"의 응답이 5초이상으로 로깅된다... 하악하악

 

해당 시간대를 클릭해서..호출되는 path를 파이 차트로 그려놓았다.

 

겸사겸사.. 해당 end-point를 다 다시 정리했다.

그럼에도 문제는 해결되지 않았다.

기존 리소스를 리팩토링를 했다는 것에 만족.....

 

결론은 해당 endpoint가 문제가 아니라... 해당 endpoint가 실행할 때 어디선가...블락킹이 발생한다는 것이다.

 

 

처음으로 돌아가서 다시 다시 생각해 보자.

 

1. 정기 배치는 결제 모듈에서 진행한다. 

2. 결제 모듈의 트리거는 내 모듈에서 진행한다.  <-- 이것을 놓쳤다.. 자체적으로 배치를 돌린다고 생각했다.

 

결제모듈의 배치가 5초 소요된다... 근데 문제는 결제 모듈을 실행하는 트리거가 나한테 있었다.

@Scheduled(cron = "0 0 10,16 * * ?")
fun payScheduler() {
    if(Props.PROFILE == "prod" || Props.PROFILE == "dev") {
        ServiceUtils.getBatchHistoryService().save("pay")
        .doOnNext{
            val httpRequest = HttpRequest(freePass = true)
            httpRequest.requestPost(Props.CLASS_URL + "/admin/payment",....
        }.subscribe()
    }
}

 

doOnNext 블록은 subscribe() 호출로 인해 실행된다... "블로킹 I/O가  발생하면" 이 호출은 응답이 올 때까지 해당 스레드를 막아버린다. ㅠㅠㅠㅠㅠ

 

내부 결제 모듈을 호출하는 코드가 5초가 소요되니..... 5초동안.. 문제가 발생했던것이다.

 

두 가지 방법이 있다.

 

1. webclient로 교체 

val webClient = WebClient.of(Props.CLASS_URL)
val headers = RequestHeaders.of(
	HttpMethod.POST, "/admin/payment",
	HttpHeaderNames.AUTHORIZATION, "Bearer " + Props.FREE_PASS
	)
webClient.execute(headers).aggregate()

 

 

2. doOnNext 블록을 fromCallabe 처리

 Mono.fromCallable {
 	...
 }

 

딱 1주일 걸렸따. ㅋㅋㅋㅋ아오!!

 

모든 것이 좋았다.

'개발이야기' 카테고리의 다른 글

데이터 설계.. 개똥 철학  (0) 2025.10.27
수집된 zipkin 데이터를 이해해보자.  (0) 2025.09.23
리팩토링 - 객체 주입에 대한..  (2) 2025.08.14
아르메리 모니터링(2)  (6) 2025.08.12
아르메리 모니터링(1)  (1) 2025.08.06