본문 바로가기

성능 개선4

Fan Out TimeLine on Read vs Write 팬 아웃 타임라인의조회를 더 빠르게한 경험을 담은 글 입니다. FanOut이란소셜 미디어나 뉴스 피드와 같은 시스템에서 사용되는 데이터 전송 패턴으로, 사용자의 활동이나 게시물이 다른 사용자들의 타임라인에 어떻게 전달되는지를 설명하는 방식입니다. FanOut Read란사용자가 자신의 타임라인을 조회할 때마다, 그때 실시간으로 팔로우하는 사용자의 최신 게시물을 수집하여 타임라인을 구성하는 방식입니다. FanOutRead 흐름잡기public PostCursorDto execute(Long userId, PostsCursorRequest request) { userReadService.getUser(userId); List followings = followReadService.getFollow.. 2024. 10. 11.
Cursor기반 페이지네이션으로 응답 속도 개선하기 OffSet기반 페이지네이션에서속도 개선 경험을 작성한글 입니다. 테스트 환경 : M1 mac - RAM 8GB 문제점OffSet기반 페이지네이션을 사용할 때, DB에서 넘겨준 offset 위치를 찾기 위해서 맨 처음부터 데이터를 한번 훑게 됩니다.만약, 총 100만개의 데이터가 DB에 존재하고, offset을 100만이라고 주는 경우, 100만개의 데이터를 훑은 다음에 이후의 데이터를 가져와야 하므로, 성능 저하가 발생할 수 있다. 즉, offset이 클수록 성능이 저하된다. 성능저하 확인하기테스트 환경 : POSTMANDB에는 100만개의 더미데이터를 저장해 두었고, 극단적인 성능 저하를 확인하기 위해서, [offset:0, size:1]과 [offset:999999, size:1]인 두 상황의 응답.. 2024. 10. 10.
인덱스로 빠른 조회 만들기 인덱스를 사용해서 쿼리 조회성능을 개선한 경험을 글로 작성하였습니다.준비물Mysql에 100만개의 데이터를 먼저 넣어줍니다.@Test@DisplayName("대용량 데이터 넣기")void bulkInsert() throws Exception{ //given EasyRandom easyRandom = PostFactory.get(3L, LocalDate.of(1999,1,1), LocalDate.of(2024, 2,1)); //when ObjectStopWatch.start(); List posts = IntStream.range(0, 10000 * 100) .parallel() .mapToObj(i -> easyRandom.next.. 2024. 10. 8.
[테스트 환경] 벌크 쿼리(Bulk Query) 사용하기 테스트 환경에서 벌크 쿼리를 사용해성능을 개선한 경험을담았습니다. 🙆🏻‍♂️ 개선할 점테스트 코드에서 데이터베이스(MySQL)에 데이터를 저장할 때, 반복문을 사용하여 데이터 저장을 수행했습니다. 하지만 반복문이 실행되는 횟수만큼 쿼리가 실행되기 때문에, 예를 들어 100만 건의 데이터를 저장할 경우, 100만 번의 쿼리가 실행됩니다. 이는 저장할 데이터와 쿼리 실행 횟수가 1:1 비율로 증가하여 매우 비효율적이라고 생각합니다.  개선한 방법벌크 쿼리(Bulk Query)를 사용하여 만 건의 데이터를 한 번의 쿼리로 처리했습니다. 이를 통해 데이터 저장 시 쿼리 실행 횟수를 줄이고 성능을 크게 향상시킬 수 있었습니다.   벌크 쿼리 사용전 코드@Testvoid not_use_bulkInsert() .. 2024. 10. 7.