1. 캐시 무효화 전략에 대해 설명해주세요
  2. Redis에서 데이터가 영구적으로 저장되지 않는 이유와 이를 방지하기 위한 방법을 설명해주세요
  3. JVM 튜닝을 통한 성능 최적화 방법을 설명해주세요
  4. 스레드 풀과 비동기 작업을 사용한 성능 최적화 방법을 설명해주세요
  5. 서버의 CPU, 메모리 사용률을 모니터링하고 최적화하는 방법을 설명해 주세요

1. 캐시 무효화 전략

캐시 무효화 전략에 대해 설명해주세요

캐시 무효화

  • 캐시에 저장된 데이터가 더 이상 유효하지 않을 때, 이를 제거하거나 갱신하여 최신 상태를 유지시키는 전략
  • 데이터 일관성을 유지하는데 필수적

만약 하나의 링크가 DB에서 사라짐. 이 경우 캐시된 링크가 무효화되지 않더라도 대부분의 사용자는 문제 없이 페이지를 이용 가능하지만 몇몇 사용자는 404에러를 마주함 = 해당 링크는 더 이상 유효하지 않기 때문에, 그러나 보여주는 페이지 자체는 아무런 문제가 없어 디버깅이 까다로움

캐시를 사용하지 말아야 하는 경우

  1. 원래 데이터 소스가 무거운 경우 (DB에서 여러 복잡한 조인 과정이 필요한 경우)
  2. 데이터가 매 요청마다 갱신될 필요가 없는 경우
  3. 데이터를 가져오는 작업에 부작용이 없어야 하는 경우(은행 전산 시스템)
  4. 데이터가 자주 접근되고 한 번 이상 필요한 경우
  5. 캐시 적중률
  • 캐시 데이터와 원본 저장소의 데이터가 일관성을 유지하게 해야 함
  • 데이터베이스에서 데이터가 수정된 경우 캐시 데이터를 유효성 검증을 통해 데이터를 무효화 시켜야 함

Write-through(쓰기 직전)

  • 데이터가 캐시에 저장되기 전에 데이터베이스에 먼저 쓰는 전략
  • 캐시와 데이터베이스가 항상 동기화 상태 유지
  • 읽기성능은 좋음, 쓰기 성능은 약간 저하

Write-around(쓰기 우회)

  • 데이터에 캐시를 쓰지 않고 바로 데이터베이스에 저장하는 방식
  • 자주 사용되지 않는 데이터를 캐시에 쓰지 않아 불필요한 데이터가 캐시에 채워지는것 방지
  • 쓰기성능은 좋음, 자주 읽는 데이터에 대해 캐시 미스 초래

Write-back(쓰기 후방)

  • 데이터를 캐시에 먼저 쓰고, 일정시간이 지난 후 특정 조건이 충족되면 데이터베이스에 쓰는 방식
  • 쓰기 성능향상, 캐시가 비우기 전에 시스템이 종료되면 데이터 손실 위험

Cache Eviction(캐시 제거)

  • 캐시의 공간이 부족할 때 오래된 데이터나 자주 사용되지 않는 데이터를 제거하는 전략
  • LRU(Least Recently Used) : 가장 오랫동안 사용되지 않은 데이터
  • LFU(Least Frequently Used) : 가장 사용 빈도가 낮은 데이터
  • FIFO(First in First out) : 캐시에 가장 먼저 들어온 데이터 먼저 제거

TTL(Time to Live)

  • 캐시 항목에 수명 시간을 설정하여, 일정 시간이 지나면 자동으로 무효화
  • 데이터가 자주 변경되거나 실시간 데이터가 필요한 경우 유용

Explicit Invalidation(명시적 무효화)

  • 데이터가 변경될 때 개발자가 명시적으로 캐시를 무효화하는 방식
  • 데이터베이스의 특정 레코드가 업데이트되면 해당 레코드에 대한 캐시를 무효화

이벤트 기반 무효화

  • 특정 이벤트 발생에 따라 캐시 데이터 무효화
  • 필요할 때만 무효화가 되도록 하는 정밀한 무효화 접근 방식

버전 기반 무효화

  • 캐시에 각 데이터의 버전 번호가 할당되며 데이터가 변경될때마다 버전 번호 증가
  • 데이터가 무효화되면 버전 번확 캐시에서 업데이트 되어 가장 최신 버전의 데이터만 사용되도록 함
  • 버전 번호 관리를 위한 추가 오버헤드 필요

캐시 무효화란 무엇이며, 왜 필요하다고 생각하시나요?

2. Redis에서 데이터가 영구적으로 저장되지 않는 이유와 이를 방지하기 위한 방법을 설명해주세요

Redis

  • 인메모리 기반 데이터 저장소
  • 데이터를 빠르게 읽고 쓰는 데 최적화되어 있음

데이터가 영구적으로 저장되지 않는 이유

  1. 메모리 기반 저장소 : 서버가 재시작되거나 장애가 발생하면 메모리에 저장된 데이터가 모두 사라짐
  2. TTL : TTL을 설정하면 TTL이 만료되었을 때 해당 키가 자동으로 삭제됨
  3. Eviction : 메모리 제한이 설정된 상태에서 메모리가 부족할 경우 데이터 제거

영구적인 저장을 위한 방법

  1. AOF(Append-Only File) 설정 :
    1. Redis에서 데이터를 영구적으로 저장하기 위한 로그 기반 방법
    2. 모든 쓰기 연산 기록
    3. AOF 파일이 커질 수 있음, I/O 작업이 많아져 성능에 영향
  2. RDS(Snapshot) :
    1. 데이터베이스 전체 상태 저장
    2. 복구시 빠르게 로드
    3. 스냅샷 사이 데이터 변경은 손실될 수 있음
    4. CPU, 디스크 사용량 증가
  3. Redis 클러스터 사용
    1. 데이터를 여러 노드에 분산 저장
    2. 특정 노드가 다운되더라도 다른 노드에서 데이터 복구 가능
    3. 클러스터 설정이 복잡함

3. JVM 튜닝을 통한 성능 최적화 방법을 설명해주세요

JVM

  • 자바 애플리케이션을 실행하기 위한 가상 머신
  • 메모리구조를 통해 자바 프로그램이 효율적으로 실행될 수 있도록 함
  1. 힙 메모리 크기 조정 (초기 힙 크기, 최대 힙 크기 설정)
  2. 가비지 컬렉션 튜닝 ( Serial GC, Parallel GC 등 가비지 컬렉션 로그를 분석하고 적절한 알고리즘 선택)
  3. 쓰레드의 스택 크기를 조정하여 메모리 사용 최적화
  4. 메타스페이스 크기 조정
  5. 스레드 풀 크기 조정

4. 스레드 풀과 비동기 작업을 사용한 성능 최적화 방법을 설명해주세요

스레드 풀 사용

  • 미리 일정 개수의 스레드를 생성해 두고, 작업이 들어올 때마다 생성된 스레드가 작업을 처리하도록 하는 방식

  • 장점 : 스레드 생성 제한, 메모리 및 CPU 사용을 효율적으로 관리, 성능 향상

  • 단점 : 복잡성 증가, 데드락

  • 재사용 작업큐 스레드수 관리