전체 글

· BackEnd
▶ 들어가며이전 글을 보면 알겠지만 나는 캐시 스탬피드 현상을 막기 위해 Redis 분산 락을 도입했다. 락을 못 잡은 스레드들은 AI 호출이 끝날 때까지 기다렸다가 캐시를 읽어야 하는데,이 대기 로직을 처음에 200ms 간격 폴링으로 구현했었다. 동작은 잘 됐다. 하지만 마음에 걸리는 부분은만약에 락이 1ms 만에 해제되었다고 해도, 다음 폴링 사이클이 돌아올 때까지 최대 200ms를 그냥 흘려보내야 한다는 점이었다. 따라서 이 글은 그 불필요한 대기시간을 제거하는 과정을 다룬다. 폴링 대안으로 무엇을 검토했는지, Redis Pub/Sub은 어떻게 적용했는지,그리고 이 과정에서 만난 Race Condition과 ConcurrentModificationException 같은 함정들을 어떻게 처리했는지를 ..
· BackEnd
▶ 들어가며투성투성은 사용자의 관심 종목을 기반으로 매일 아침 AI가 오늘의 주식 브리핑을 생성해주는 서비스이다.브리핑 생성에는 OpenAI API 호출이 필요하고, 결과는 Redis에 자정까지 캐싱된다.이렇게 보면 크게 문제될 건 없어보인다. 단순한 캐시구조라는 생각이 든다. 하지만자정 직후 모든 사용자의 캐시가 동시에 만료되고 수천개의 AI 요청이 동시에 발생할 수 있는 구조적 결함을 발견했다. 이 글은 두가지 문제를 다룬다.하나는 Cache Stampede라는 동시성 문제,다른 하나는 운영 환경에서 치명적이지만 눈에 띄지 않는 KEYS 명령어 문제이다. 각 문제를 발견하고 해결 방법을 검토한 뒤 최종 선택에 이르는 과정을 기록한다.▶ 문제 1 : KEYS - 보이지 않는 시한폭탄CacheEvictS..
· BackEnd
▶ 들어가며▷ 투성투성이란?투성투성은 사용자가 등록한 관심 종목의 뉴스와 공시를자동 수집·AI 분석하여 매일 아침 개인화된 브리핑을 제공하는관심 종목 기반 개인화 주식 정보 서비스이다. 사용자가 관심 종목을 등록하면, 해당 종목의 뉴스(네이버 API)와 공시(DART)를 자동으로 수집하고 OpenAI API로 분석한다. ▷ 문제 발생관심 종목 기반 뉴스 서비스에서 데이터 수집 배치는 그 무엇보다도 핵심적인 인프라다.투성투성은 설정으로 30분마다 네이버 검색 API에서 관심 종목별 뉴스를 수집하고, 이후 OpenAI로 분석을 수행한다. 물론 처음에는 아무 일도 없었지만, 관심 종목 수가 늘어나면서 배치 실행 시간이 선형으로 증가하는 문제가 발생하였다. 코드를 열어보니 이게 웬걸성능이 무너져내리는 이유가 ..
· BackEnd
▶ 들어가며멀티턴 AI 어시스턴트는 대화 맥락을 기억해야 한다. 기억하지 못한다면 큰 의미가 없다고 생각한다.그런데 그 "기억"을 단순히 Redis 리스트에 쌓아두면, 대화가 길어질수록 매 요청에 포함되는 히스토리 토큰이 선형으로 늘어나게 된다. Calio를 개발하면서 해당 문제를 마주쳤고,Redis 슬라이딩 윈도우와 LLM 롤링 요약을 결합한 하이브리드 방식으로 히스토리 토큰을 O(1)로 고정하였다. 이 글은 "어떻게 만들었는가" 보다 "왜 이 방법을 선택했는가"에 집중한다.대안을 검토하고 각각을 이 서비스의 조건에 맞춰 생각하는 과정을 담았다.▶ 문제 정의▷ 전체 히스토리를 매 요청마다 LLM에 전달하고 있었다기존 ChatServiceImpl.sendMessage()는 사용자 메시지를 처리할 때마다/..
· BackEnd
▶ 들어가며▷ Calio란?Calio는 자연어로 일정과 할일을 등록하면 AI가 사용자의 패턴을 학습하여 선제적으로 다음 일정을 추천하는 앱이다.사용자가 일정을 등록할 때마다 제목, 내용, 장소를 하나의 텍스트로 합쳐 임베딩하고, 그 벡터는 Qdrant에 저장한다.이후 AI가 Qdrant에서 유사 벡터를 검색하여 컨텍스트로 활용한다. ▷ 어느 날...어느 날 PR을 올리기 위해서 일정 등록 API 테스트를 진행 하였다.어라? 기존 40~50ms의 응답 속도를 뽐내던 API가 나의 개발을 거친 후 889ms라는 퍼포먼스를 보여주고 있었다.아.뿔.싸이 수치는 거진 사용자가 일정 등록 버튼을 누른 뒤 약 1초를 기다려야 한다는 뜻이다.빨리빨리인 한국인으로써 저는 용납할 수 없었다.원인을 파악하기 위해 각 처리 ..
▶ 1. 들어가면서▷ 1-1. 왜 토큰 재발급이 필요한거지?JWT 기반 인증 시스템에서 Access Token은 보안상의 이유로 짧은 만료 시간을 갖는다.이 말은 뭐냐면... 만료 시간이 끝나면 로그아웃된다는 것.그러면 사용자는 재로그인을 해야한다는 것.-> 이는 사용자 경험 측면에서 굉장히 좋지 않다. 이를 해결하기 위해 Refresh Token을 도입하여, Access Token이 만료되더라도 사용자가 다시 로그인하지 않고 새로운 토큰을 발급받을 수 있도록 하는것이다. ▶ 2. RTR(Refresh Token Rotation) 패턴▷ 2-1. 기존 방식의 보안 취약점일반적인 Refresh Token 방식에서는 동일한 Refresh Token을 만료 시점까지 반복 사용한다.이 경우 Refresh Tok..
LearningStudy
끊임없는 탐구