Skip to main content

Command Palette

Search for a command to run...

[Redis] Redis 캐시 방어 로직 추가 및 Upstash 연결하기

Updated
2 min read

드디어 Redis가 죽으면 어떻게 할지 방어 로직을 추가했다.


1. 조회 캐시 vs 인증/토큰

먼저, Redis가 다운되는 것뿐만 아니라 지연되는 것도 생각해야 된다. 그래서 redis가 다운/지연된다면 DB로 fallback 하는 로직을 추가하게 되었다. 하지만 지금 redis를 사용하는 부분은 인기글 조회, 인기 현상소 조회와 인증/토큰 부분이었다.

Redis -> 실패/타임아웃 -> DB 조회

조회 캐시는 이런 흐름으로 방어 로직을 넣었다.

하지만 인증/토큰 부분은 얘기가 다르다. Redis가 안 된다고 DB로 넘겨 버리면 인증 번호 재사용 위험, 만료 처리 꼬임 등 여러 문제가 생긴다고 생각되었다. 그래서 인증 실패 응답을 띄우는 게 더 나을 것 같다고 생각했다. 그래서 조회 캐시 부분만 방어 로직을 적용했다.


2. Upstash 연결

기존에는 Redis를 도커에 붙여서 사용했는데 Upstash로 연결하면 관리하기 더 편하다는 얘기를 들었다. 그래서 무료 플랜이 있길래 사용해 보기로 했다.

사진처럼 설정해서 사용했다. 지역에는 한국이 없어서 일본으로 설정하고 넘어갔다. 무료 플랜으로 설정하면 카드 입력도 안 해도 돼서 혹시 모를 불안감이 안 생기고 좋은 것 같다.

첫 번째 사진에 있는 Read Regions는 유료 플랜만 가능한 기능이다. 읽기 전용 복제본을 다른 지역에 두는 기능으로 쓰기(write)를 한국에서 하면, 읽기(read)를 미국으로 설정할 수 있다. 그러면 전 세계 유저가 빠르게 조회 가능하다고 한다. 하지만 쓰기 성능에는 영향이 없고 읽기 트래픽이 많을 때 의미가 있다고 한다.

그리고 Eviction은 저장 공간이 꽉 찼을 때, 기존 데이터를 자동으로 지울지 말지를 정하는 옵션이다. 우리 프로젝트는 인증/토큰뿐만 아니라 조회 캐시에서도 Redis를 사용하고 있어, 초기에는 예상치 못한 에러를 피하기 위해 일단 off로 설정하고 시작했다.

Upstash를 연결하면 사진처럼 commands가 늘어나는 걸 볼 수 있다. 그리고 사이트 내 CLI를 이용해서 캐시 초기화도 한 번에 가능하다. 원래라면 도커로 들어가고, 날리고, 다시 나오고... 번거로움이 있었지만 편하게 날릴 수 있다.

Upstash를 연결하고 connect-timeout과 timeout을 각각 1s, 2s로 수정했다. 원래는 10ms, 20ms였는데 그러면 네트워크가 왕복하기에 너무 촉박하기 때문이다. Upstash는 인터넷 너머에 있는 Redis이기 때문에 원래 설정했던 값들이랑은 문제가 있었다. 그리고 docker-compose-dev에서도 Redis 관련 설정을 제거했다. 다른 docker 파일은 추후 인증/토큰 부분도 방어 로직이 추가된다면 제거할 예정이다.


오늘의 요약

  • Redis는 타임아웃 설정이 핵심이다.

  • 조회 캐시와 인증/토큰은 성격이 다르다.

More from this blog

[Elasticsearch] Elasticsearch 기본용어와 CRUD 명령어

-elastic ▶ 들어가며 이번 글에서는 Elasticsearch를 공부하면서 가장 먼저 익혀야 하는 기본 용어를 정리하고,직접 코드를 쳐가며 CRUD(Create / Read / Update / Delete) 명령어에 익숙해지는 시간을 가져보려고 한다. Elasticsearch는 처음 보면 생소한 용어가 많아서 막막할 수 있는데,사실 구조적으로는 우리가 익숙한 MySQL과 닮은 부분이 굉장히 많다. 둘 다 데이터베이스라는 큰 틀 안에서 데...

Feb 17, 20264 min read

Jpa N+1 문제, 우리는 이렇게 잡았다 — 1:1 문의 Api 실전 최적화기

코드 리뷰 한 줄에서 시작된 쿼리 최적화 여정 1. 시작 — "일단 돌아가게 만들자" Finders 프로젝트에서 1:1 문의(Inquiry) API를 맡았다. 현상소에 문의를 남기고, 답변을 받고, 목록을 조회하는 — 평범한 CRUD다. "JPA 쓰면 쿼리 안 짜도 되는 거 아니야?" 솔직히 처음엔 그렇게 생각했다. JpaRepository에 findAll, findById 쓰면 끝이니까. // 첫 번째 버전의 목록 조회 (QueryDS...

Feb 11, 20268 min read

[모니터링] Sentry 도입부터 Discord 에러 알림까지 — 서버 감시 시스템 구축기

"서버 죽었는데 아무도 몰랐다"에서 "에러나면 1분 안에 안다"까지 1. 모니터링을 시작한 계기 프론트엔드: "API 안 되는데요?"백엔드: "엥? 언제부터요?"프론트엔드: "...2시간 전부터요?"백엔드: 😱 어느 날 서버가 죽어있었는데 아무도 몰랐다. 그날 이후, 모니터링 시스템 구축을 결심했다. (Issue #102) 2. 모니터링 도구 비교: 뭘 쓸까? 처음에는 여러 도구를 비교했다. 도구무료 티어장점단점 Sent...

Feb 11, 20268 min read

[CI/CD] 수동 태그에서 자동 릴리즈까지 — Git Flow와 Auto Release

🚀 우리 auto-release.yml 바로 보러가기 → 이 글에서 설명하는 워크플로우의 전체 코드를 바로 확인할 수 있다! main에 머지만 하면 버전 태그부터 릴리즈 노트까지 알아서 생긴다 1. 우리의 Git 전략: Git Flow (경량 버전) Finders 프로젝트는 Git Flow 전략을 사용하고 있다. 다만 hotfix나 release 브랜치 없이, 조금 가볍게 운영한다. main ← 운영 서버 (prod) 배포 브...

Feb 11, 20265 min read

[ci/cd] 대학생 팀의 배포 파이프라인 진화기

PR 하나면 끝나는 무중단 배포까지, 삽질의 기록 1. 시작은 단순했다 "서버에 올려야 하는데... 어떻게 하지?" Finders 프로젝트를 시작했을 때, 배포라는 걸 해본 적이 없었다. 그래서 처음에는 이렇게 했다. 1. SSH로 서버 접속 2. git pull 3. ./gradlew build 4. java -jar app.jar 당연히 문제가 생겼다. 빌드하는 동안 서버가 꺼져있음 (프론트: "API 왜 안 돼요?" 🔥) 빌...

Feb 11, 20267 min read
F

Finders Tech Blog

16 posts