멀티 서비스 환경 + 비동기 로그 추적 - MDC
·
소프트웨어 마에스트로 16기/팀 프로젝트 - 꼬꼬면
[개요]본 프로젝트는 Spring Boot와 MySQL을 활용한 모의 면접 서비스입니다. 이 글은 사용자 요청에 대한 로그를 추적하는 과정에서 스레드 풀 재사용으로 인한 로그 추적 문제를 MDC를 통해 해결한 내용에 대해 설명합니다. ThreadLocal 이라는 MDC 특성상 비동기 스레드를 사용했을 때 MDC가 전파되지 않는 문제와 멀티 서비스 환경에서 다른 서버로 요청을 보낼 때 MDC 값이 사라지는 문제에 대한 해결에 대해서도 다룹니다. [요약]톰캣 스레드 풀 재사용과 서버 다중화 환경에서 요청별 로그 추적이 가능하도록 MDC를 적용했습니다.TaskDecorator를 통해 MDC 컨텍스트를 비동기 스레드로 전파하고, Nginx에서 전달받은 고유한 X-Request-ID 헤더를 다른 서버 요청 시에도..
LLM 호출 - 트랜잭션 분리 및 비동기 + 폴링으로 히카리 풀 및 톰캣 스레드 풀 고갈 문제 해결 (+ 블로킹 vs 논블로킹 성능 비교 테스트)
·
소프트웨어 마에스트로 16기/팀 프로젝트 - 꼬꼬면
[개요]본 프로젝트는 Spring Boot와 MySQL을 활용한 모의 면접 서비스입니다. 이 글은 모의 면접 진행 과정에서 LLM 호출로 인해 히카리 커넥션 풀과 톰캣 스레드 풀이 고갈되어 다른 API 응답이 수십 초 지연되는 문제를 해결한 과정을 다룹니다. 또한 트랜잭션 분리 과정에서 발생한 토큰 정합성 문제를 분산 락으로 해결한 방법에 대해서도 다룹니다. 마지막으로 비동기 방식에서 LLM 호출 시 블로킹 방식과 논블로킹 방식의 성능을 부하 테스트를 통해 비교 분석한 결과를 제시합니다. [요약]LLM 호출로 인한 히카리 커넥션 풀 고갈 문제는 트랜잭션 분리를 통해 해결했으나, 이로 인해 발생한 토큰 정합성 문제를 Redis 분산 락으로 해결했습니다. 톰캣 스레드 풀 고갈 문제는 비동기 처리와 폴링 방식..
빈번한 조회수 업데이트 - Redis write back 패턴으로 조회 성능 개선 (+ fall back 처리)
·
소프트웨어 마에스트로 16기/팀 프로젝트 - 꼬꼬면
[개요]본 프로젝트는 Spring Boot와 MySQL을 활용한 모의 면접 서비스입니다. 이 글은 조회 API에서 조회수를 업데이트할 때 Redis write back 패턴으로 성능을 개선한 사례를 다룹니다. 또한 Redis 장애 상황에 대한 fallback 처리 방법도 함께 설명합니다. [요약]매번 DB에 증분 쿼리를 실행하는 대신 Redis에 조회수를 저장하고 주기적으로 DB와 동기화하는 write back 패턴을 도입했습니다. 그 결과 TPS를 84% 개선(186 TPS → 342 TPS)했습니다. 추가로 Redis timeout 설정과 장애 시 DB 직접 조회를 통한 fallback 처리로 조회 API의 안정성을 보장했습니다. [조회 API 성능을 개선한 이유]조회수 기능을 구현하는 과정에서 조회..
MySQL 쿼리 개선기 - 인덱스를 활용한 정렬보다 Using temporary, Using filesort가 더 빠르다고?
·
우아한테크코스 6기/팀 프로젝트 - 투룻
개요개선을 경험한 내용을 공유하고자 합니다. 프로젝트에서 쿼리 성능을 개선하기 위해 `GROUP BY`와 `JOIN`의 순서를 바꿔 NL(Nested Loop) JOIN의 드라이빙 테이블 크기를 줄이고, 인덱스를 활용한 정렬이 깨지지 않도록 개선하였습니다. 그리고 서브 쿼리에서 커버링 인덱스를 적용했습니다. 최종적으로 `GROUP BY` + `HAVING` 을 여러 개의 `JOIN` 으로 변환해 임시 테이블 없이 인덱스를 더 잘 활용하도록 개선하였습니다. 이 과정을 통해 **쿼리 성능을 최대 722배 개선**할 수 있었습니다.이 글에서는 정렬 시 인덱스를 활용하는 것이 중요하지만, 드라이빙 테이블의 크기가 쿼리 성능에 미치는 영향이 더 클 수 있다는 사실을 다룹니다. 또한 커버링 인덱스에서 복합 인덱스..
지속 가능한 속도(레벨 3 글쓰기 미션)
·
우아한테크코스 6기/6기
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.애자일 프로세스들은 지속 가능한 개발을 장려한다. 스폰서, 개발자, 사용자는 일정한 속도를 계속 유지할 수 있어야 한다. 애자일을 주제로 테코톡을 준비하며 인상 깊었던 내용은 지속 가능한 속도(Sustainable Pace)에 대한 것이었다.단순히 애자일을 "기민함", "빠르게"라고 알고 있었기에 신선한 충격으로 다가왔다.매일 과업을 하며 과속을 내는 것이 단기적으로 보았을 땐 빨라 보일 수 있겠지만, 장기적으로 보았을 땐 오히려 생산성을 떨어뜨린다.이는 ..
[MySQL] INSERT IGNORE 는 데이터 중복 시 왜 새로운 데이터의 삽입을 막을까?
·
우아한테크코스 6기/팀 프로젝트 - 투룻
동시성 문제(데드락) 해결기 - X 락인데 왜 공유가 가능하지?????? 동시성 문제(데드락) 해결기 - X 락인데 왜 공유가 가능하지??????이번 글에서는 팀 프로젝트에서 겪은 동시성 문제와 MySQL의 락을 사용하다가 경험한 데드락에 관해 이야기합니다. 특히 갭 락은 X 락이더라도 공유가 가능하므로 데드락이 발생할 수 있다는 사nakhonest.tistory.com 이전 글에서는 동시성 문제를 INSERT IGNORE를 사용해 해결한 경험을 공유했습니다. INSERT IGNORE 는 unique 인덱스가 설정된 상황에서 중복된 unique 키로 삽입을 시도할 경우, 에러를 발생시키지 않고 해당 삽입을 무시합니다. 하지만 매번 INSERT 쿼리를 실행하면 성능이 저하가 우려되어 이를 테스트를 하는 도..
동시성 문제(데드락) 해결기 - X 락인데 왜 공유가 가능하지??????
·
우아한테크코스 6기/팀 프로젝트 - 투룻
이번 글에서는 팀 프로젝트에서 겪은 동시성 문제와 MySQL의 락을 사용하다가 경험한 데드락에 관해 이야기합니다. 특히 갭 락은 X 락이더라도 공유가 가능하므로 데드락이 발생할 수 있다는 사실을 강조합니다.이 과정에서 MySQL의 락 메커니즘을 깊이 있게 다룹니다. 그리고 이 문제를 락을 사용하지 않고 어떻게 해결했는지 공유합니다.이 글을 통해 MySQL의 락 메커니즘을 이해하고 락을 사용할 때 발생할 수 있는 데드락의 원인을 파악할 수 있습니다. MySQL의 락을 더욱 안전하게 활용하는 데 도움이 되기를 바랍니다. 문제 발생 상황팀에서 여행기 장소를 조회하고 저장하는 기능을 개발하던 중, 여러 사용자가 동시에 장소를 저장할 때 중복된 장소가 저장되는 문제를 겪었습니다.문제 설명 전 알아둘 프로젝트의 사..
들풀의 그늘(레벨 2 글쓰기 미션)
·
우아한테크코스 6기/6기
들풀의 그늘선한 영향력을 끼치는 삶.돈이나 권력을 좇으며 자신만을 위해 살아가지 않고, 옆에 있는 이와 더불어 함께하는 삶.지금까지 그렇게 살아가고자 하는 어른들을 심심치 않게 볼 수 있었다. 멀리 내다볼 것 없이 부모님이 그렇게 살아가고 있으니 말이다.어렸을 때부터 부모님은 들풀처럼 살아가라고 말씀하셨다.다름에 대해 지적하고, 따가운 시선으로 실력을 평가하는 직사광선의 세상 속에서작은 새들이 쉬어갈 수 있는 그늘을 제공하라고 하셨다.크고 화려한 나무처럼 커다란 그늘은 아닐지라도,단 한명이라도 좋으니 누군가의 그늘이 되어주는 들풀처럼 살아가라고 하셨다.지금껏 그러한 그늘 아래에서 얼마나 많은 사랑을 받으며 자라왔는가. 힘들 때 위로가 되어주었던 선배들과 친구들이 얼마나 많았는가. 안락하고 평안한 그늘 아..