대머리개발자

R2DBC + 레디스 성능 테스트 본문

개발이야기/성능

R2DBC + 레디스 성능 테스트

대머리개발자 2024. 11. 5. 15:29
728x90

 

부하 :  nGrinder

 

R2DBC + 레디스

R2DBC + mysql

 

쿼리 수행시간이 평균 4ms으로 나오는 EndPoint  ( 레디스 )

쿼리 수행시간이 평균 5ms으로 나오는 EndPoint  ( mysql )

 

 

레디스가 약 63%로 빠르다.

 

레디스를 적재적소에 사용을 하면 최적화된 피드백을 전달할 수 있다.!!

당영한 이야기지..괜히 캐쉬로 쓰는것이 아니다.

 

webflux, 논-블로킹, 비동기,..을 사용하는 이유는... 최소한의 자원으로 최대한의 효과를 얻기 위함이다.

 

 

성능 향상 keyword

- 논-블로킹으로 처리를 하더라도 step by step으로 하는 것이 아니라 필요에 따라서 동시(병렬)로 처리

- 엔티티가 아닌 DTO로 처리 -> 바인딩하는데 좀 더 걸린다.

 : 별다른 로직이 없는데 쿼리 수행시간보다..응답 시간이 생각보다 많이 나온다면 해당 이슈일 확률이 높다!

 

 

코루틴..이용

   fun get(boardId: Long, topMenuId:Long = 0): APIResult {
        val (userId, isAdmin)  = ContextUtil.getThreadLocal()

        // DTO 처리
        val boardDto = getSimple(boardId)

        boardDto.bindingMenu(ServiceUtils.getMenuService().get(boardDto.menuId))

       // 병렬 처리하고 제일 늦게 끝나는 놈까지. await 한다.
        runBlocking {
            scope.async(ContextUtil.getThreadContext().asContextElement()) {

                async(Dispatchers.IO) { /* 조회수, 좋아요 카운트*/ }

                async(Dispatchers.IO) { /* 내가 좋아요 했는쥐? */ }

                async(Dispatchers.IO) { /* 권한? */}

                async(Dispatchers.IO) { menuOptions(boardDto, topMenuId) }

            }.await()
        }

        // 수행 여부 상관없이 슝 지나간다.
        scope.launch(Dispatchers.IO) { asyncHistory(boardId) }

      return APIResult(boardDto)
    }

 

 

Mono.zip 이용.

return Mono.zip(
    answerRepository.searchAnswersByUser(formId, filter.pageIndex, filter.pageSize).collectList(),
    answerRepository.countAnswersByUser(formId)
).flatMap {
    fetchListResponse(it.t1, it.t2.toLong())
}
//        return answerRepository.searchAnswersByUser(formId, filter.pageIndex, filter.pageSize)
//            .collectList()
//            .flatMap {
//                answerRepository.countAnswersByUser(formId).flatMap { cnt ->
//                    fetchListResponse(it, cnt.toLong())
//                }
//            }

 

 

 

728x90