Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Redis 장애 대응 - 분산 락 및 캐시 리포지토리 Fallback 구현 #320

Open
toychip opened this issue Jan 2, 2025 · 0 comments · May be fixed by #321
Open

feat: Redis 장애 대응 - 분산 락 및 캐시 리포지토리 Fallback 구현 #320

toychip opened this issue Jan 2, 2025 · 0 comments · May be fixed by #321

Comments

@toychip
Copy link
Member

toychip commented Jan 2, 2025

🤷 구현할 기능

Redis 장애 발생 시 Fallback 메커니즘을 적용하여 서비스의 안정성을 확보합니다.

  • 분산 락 (Distributed Lock): Redis 연결 실패 또는 장애 발생 시 JVM 기반 ReentrantLock을 사용하여 동시성 문제를 해결합니다.
  • 캐시 리포지토리 (Cache Repository): Redis 장애 발생 시 ConcurrentHashMap을 사용한 로컬 캐시로 자동 전환합니다.

🔨 상세 작업 내용

1. 공통 인터페이스 정의

  • CacheRepository: get, set, exists, delete 메서드를 포함한 캐시 관리 인터페이스 정의
  • DistributedLockManager: tryLock, unlock 메서드를 포함한 분산 락 관리 인터페이스 정의

2. Redis 및 Local 구현체 추가

  • RedisCacheRepository: StringRedisTemplate을 사용하여 Redis를 통해 캐시를 저장 및 관리
  • LocalCacheRepository: ConcurrentHashMap 기반으로 JVM 내 캐시를 저장 및 관리
  • RedisDistributedLockRepository: RedissonClient를 사용하여 Redis에서 분산 락 구현
  • LocalDistributedLockRepository: ReentrantLock을 사용하여 JVM 내 로컬 락 구현

3. Fallback 메커니즘 구현

  • CacheRepositoryImpl:

    • Redis를 우선 사용하여 데이터 저장 및 조회
    • Redis 장애 시 LocalCache로 자동 Fallback
    • Write-Through 전략을 통해 Redis와 LocalCache의 데이터 일관성 유지
  • DistributedLockService:

    • Redis 락을 우선 시도
    • Redis 장애 발생 시 LocalLock으로 Fallback
    • Write-Through 전략을 통해 Redis와 LocalLock의 동기화 유지

4. AOP 적용 (분산 락)

  • DistributedLockAspect:
    • @DistributedLock 어노테이션이 적용된 메서드 실행 시 분산 락 적용
    • Redis 분산 락을 우선 시도하고, 실패 시 LocalLock으로 Fallback
    • 락 해제 로직 보장

5. 데이터 동기화 (Write-Through 및 비동기 배치 처리)

  • CacheSynchronizationService:

    • @Scheduled@Async를 사용해 LocalCache 데이터를 Redis로 동기화
    • 10개씩 배치 단위로 동기화 진행하여 성능 최적화
  • LockSynchronizationService:

    • @Scheduled@Async를 사용해 LocalLock 데이터를 Redis로 동기화
    • 10개씩 배치 단위로 동기화 진행하여 병목 현상 방지

📄 참고 사항

  • Redis 장애 시 Fallback 메커니즘이 자동으로 작동하여 서비스의 가용성을 보장합니다.
  • Local Lock 및 Local Cache는 JVM 단일 인스턴스에 한정되며, 다중 인스턴스 환경에서는 완전한 동기화가 불가할 수 있습니다.
  • Redis 복구 후, 자동으로 Redis 캐시 및 락이 재활성화됩니다.
  • Docker Compose의 restart: always 설정을 통해 Redis 컨테이너는 자동으로 복구됩니다.
  • 비용 문제로 AWS ElastiCache 대신 Docker 환경에서 Redis를 사용하며, Fallback 전략을 통해 장애 상황에 대응합니다.

⏰ 예상 소요 기간

1일

toychip added a commit that referenced this issue Jan 2, 2025
캐시 저장소 공통 인터페이스 정의 (get, set, exists, delete)
toychip added a commit that referenced this issue Jan 2, 2025
- RedisCacheRepository: Redis를 통해 캐시 데이터 저장 및 조회
- LocalCacheRepository: ConcurrentHashMap 기반 로컬 캐시 구현
- CacheRepositoryImpl: Redis 우선 사용, 실패 시 LocalCache로 Fallback
- Write-Through 전략 적용 (Redis와 Local 동시 저장)
toychip added a commit that referenced this issue Jan 2, 2025
- LocalCache 데이터를 주기적으로 Redis로 동기화
- 비동기 처리를 통해 성능 병목 현상 방지
- 배치 사이즈를 작게 설정하여 처리 성능 최적화
toychip added a commit that referenced this issue Jan 2, 2025
- 분산 락 관련 공통 인터페이스 정의 (tryLock, unlock)
toychip added a commit that referenced this issue Jan 2, 2025
- RedissonLockManager: Redis 기반 분산 락 구현
- LocalLockManager: JVM 내 ReentrantLock 기반 로컬 락 구현
toychip added a commit that referenced this issue Jan 2, 2025
- Local Lock 데이터를 주기적으로 Redis로 동기화
- 비동기 처리로 병목 현상 방지 및 성능 최적화
toychip added a commit that referenced this issue Jan 2, 2025
- AOP를 통해 DistributedLockService 사용하도록 변경
- Redis Lock 실패 시 자동으로 Local Lock으로 전환
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant