Home
Slowly but Surely
Cancel

Cache Stampede 문제를 해결하기 위한 캐시 성능 개선 전략

이전에 굿잡 프로젝트에서 게시글 목록 조회에 캐시를 적용했습니다. 게시글 목록은 새로운 게시글이 추가됨에 따라 캐시 데이터와 DB 데이터와의 정합성을 어느정도 보장해야 했기 떄문에 TTL을 5초정도로 짧게 가져가서 완전한 정합성을 포기하는 대신 가용성을 챙긴 트레이드 오프였습니다. 그러나 문제는 부하 테스트 중 발견됬는데요. 5초가 지난 후 캐...

레디스에서 트랜잭션을 보장하는 방법

이전에 multi부터 exec까지의 명령어를 트랜잭션으로 하여금 명령어를 입력 순서대로 요청하는 트랜잭션 방식을 학습했었는데요. 레디스 트랜잭션에 대한 주의점과 발생한 문제를 해결하기 위한 LuaScript의 사용, 그리고 파이프라인에 대해서 공유하고자합니다. 레디스에서 트랜잭션을 보장하는 방법 기본적으로 4가지 명령어가 있습니다. mul...

캐시 적용에 따른 트레이드 오프

굿잡 프로젝트의 커뮤니티 서비스에서 게시글 목록 조회시 캐시를 도입하면서 겪었던 트레이드 오프에 대해 공유하는 글입니다. AS-IS 저희 굿잡 프로젝트는 생성 AI 서비스를 제공하는 것 외에도 커뮤니티 서비스, 최신 채용 공고 서비스, 실시간 채팅 기반의 멘토링 서비스를 제공하고 있습니다. 커뮤니티 서비스는 저희 서비스를 이용하는 사용자들이 가...

서비스 원자성 보장하기 - 카프카 트랜잭션 아웃 박스 패턴

저희 굿잡에서는 사용자의 이력서를 기반으로 한 생성 AI 서비스, 면접 예상 질문과 이력서 검토 서비스를 제공하고 있습니다. 이를 위한 사용자 요청으로부터의 플로우 차트는 아래와 같습니다. 기존의 위 과정에서 문제점을 발견하고 어떻게 해결하게 되었는지를 공유하고자 합니다. AS-IS 기존의 플로우 차트에서의 메시지 처리 과정은 다음과 같습니...

AOP를 활용한 토큰 체크 로직 분리하기

굿잡 프로젝트에서 생성 AI 서비스인 이력서 검토, 면접 예상 질문 서비스를 사용하기 위해서는 회원이어야하고,매일 회원에게 주어지는 10개의 토큰을 차감하는 방식으로 사용할 수 있습니다. 그러기 위해서는 다음과 같은 순서로 로직이 필요한데요. 토큰이 1개 이상인지 체크 토큰 감소 서비스 이용 이때 1번과 2번은 추후 신규 서비스에...

@GeneratedValue를 사용하지 않고, id를 직접 할당할 때의 주의점

JPA에서 ID를 @GeneratedValue 어노테이션을 사용하지 않고 직접 생성해서 객체에 넣어주고 save() 함수를 호출했을 때 기대했던 insert 쿼리가 아닌, select 쿼리가 한번 더 발생했던 예상치 못한 상황이 있었습니다. 그래서 엔티티 매니저가 어떤 방식으로 엔티티를 새로운 레코드인지 판단하는지 알아보고 어떻게 해결할 수 있...

다형성을 활용해 OCP를 지키면서 새로운 컴포넌트 추가하기

OCP는 SOLID 원칙 중 하나인데요. 개방-폐쇄 원칙으로써, 다음과 같은 의미를 가집니다. 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 그런데 저는 실제로 프로젝트를 진행해보면서, 확장하는데 기존 코드를 수정하는 일이 너무 많았고 사실 OCP를 지킬 수 있는건가 라는 생각을 해왔습니다. 그래서 고민하던 중, ...

쿠버네티스 로드밸런싱 적용기입니다. 그런데 이제 Istio를 곁들인

Istio Service Mesh를 사용한 서비스 모니터링 및 부하 분산에 대해서 공유하고자합니다. 현재 제가 구성한 쿠버네티스 아키텍처는 아래와 같이 이루어지고 있습니다. 인그레스 - 서비스 - 파드로 되어있기 때문에 인그레스 -> 서비스로 L7 로드밸런싱이 이루어지고 레플리카셋이 복수로 설정되어 있기 때문에, 서비스 -> 파드로...

서킷 브레이커 패턴을 적용한 쿠버네티스 트래픽 대응 전략

현재 진행중인 프로젝트의 인프라쪽을 담당하면서, 만약 트래픽이 몰렸을 때 어떤 방식으로 대응할 수 있을지, 그리고 어떻게 적용했는지에 대해서 공유하고자합니다. 현재 굿잡 프로젝트의 시스템 아키텍처는 아래와 같습니다. 인그레스 - 서비스 - (디플로이먼트) - 파드로 이루어진 쿠버네티스 아키텍처 구조이기 때문에 사용자의 요청을 인그레스가 ...

카프카 모니터링

지난번에 굿잡 프로젝트에서 사용할 카프카를 서버에 구축했습니다. 현재, 카프카 브로커를 3대로 사용하고, 주키퍼 없이 KRaft 모드로 실행하기 때문에 컨트롤러 역할을 하는 서버가 필요한데, 저는 서버 3대를 모두 카프카 브로커이자 컨트롤러 역할을 하도록 실행시켰습니다. 그리고 저는 스프링 부트 프로젝트에서 스프링 카프카를 사용해서 메시지를 프로듀...