중간 발표
서비스 아키텍쳐

서비스 아키텍쳐에 조금 수정이 있었다.
여러 서비스가 같은 DB 사용하게 되어서 data server를 추가하였다.
하나의 DB에 여러 서비스가 직접 접근하는 것보다 data server를 통해 접근하는 것이 좋아 추가되었다.
또한 서비스들의 이름이 조금 바뀐 것이 있다.
internal server → processing server, url server → fetch server로 더 이해하기 쉽게 바꾸었다.
또한 fetch server에 있던 Redis가 사용되지 않을 것 같고 CDN server에서 필요해져 옮기게 되었다.
기술적 의사 결정
업로드 응답 위치
- 문제 상황
- 동기적으로 처리 시 이미지 업로드 완료 후 응답 받음
- 이 과정 오래 걸려 사용자 경험이 저하됨
- 해결 과정
- DB에 이미지 정보 저장 후 응답 반환
- 이미지 업로드는 비동기로 처리
- 개선 사항
- 응답 속도 11MB 이미지의 경우 2.12s -> 1.3s 로 개선
resizing 이미지 파일 포맷
- 문제 상황
- resizing 이미지 여러 개 저장 가능
- resizing 이미지 저장 시 용량 문제 발생 가능
- 해결 과정
- 파일 크기 줄일 수 있는 webp 포맷 선택
- resizing 이미지 다운로드 시 다시 원래 포맷으로 변환
- 개선 사항
- jpg로 저장 시 : 162.7KB
- webp로 저장 시 : 11.7KB
storage service 선택
- 문제 상황
- 이미지 저장 시 storage service 필요
- 대용량 이미지 테스트 시 AWS S3는 비용 발생 가능
- 해결 과정
- minio 선택
- 오픈소스 소프트웨어라 비용 X
- AWS S3와 API 호환성이 높음
- 개선 사항
- 비용 절감
CDN 필요 여부
- 문제 상황
- 조회 및 다운로드 역시 시간이 오래 걸림
- 직접 storage service에 접근하는 것도 문제가 많음 (보안, 성능, 비용...)
- 해결 과정
- 조회 및 다운로드는 CDN에서 처리
- backend client에게 CDN URL 반환해 storage service URL 숨김
- 개선 사항
- 11.31MB 이미지 경우 534ms -> 212ms 로 조회 속도 개선
- (이 속도는 업로드와 많이 차이나서 다시 테스트 해 볼 예정)
트러블 슈팅
DB 서버 분리
- 문제 상황
- MSA 환경에서 여러 서버에서 같은 DB 조회 필요
- 각 서버에서 각각 DB 관리 or 각 서버에서 같은 Entity 갖기 or ....
- 해결 과정
- DB 관리 서버 생성 -> 중복 코드 관리 및 유지보수 효율성 증가
- 각 서버에서 각각 DB 관리 시 동시성 등 문제 발생 가능
- 각 서버에서 같은 Entity 가지면 DB 스키마 변경, 컬럼 추가 시 각 서버에 수정 필요
FeginClient InputStream 전송
- 문제 상황
- minio에서 이미지 반환 시 InputStream으로 받음
- CDN에 이미지 전달 시 Dto에 InputStream으로 반환
- InputStream 직렬화 지원 X
- 해결 과정
- byte[ ]로 변환해 반환
- 브라우저에게 반환 시 byte[ ]로 반환해 미리 변환해 전달
동일 클래스 메서드 호출 시 @Cacheable 불가
- 문제 상황
- CDN에서 캐싱 구현 @Cacheable로 시도
- but 동일 클래스 메서드 호출 시 @Cacheable 불가
- 해결 과정
- Redis에 이미 값들을 저장해 @Cacheable 사용하기도 이상
- Redis의 TTL 기능 사용 결정
- Redis에 값 설정 시 TTL 설정
- Redis에 값 조회 시 TTL 연장
추후 도전 사항
- CDN 이미지 캐싱 by Redis TTL, Event Listener
- CDN 용량 체크 로직 (그 후 이미지 우선 순위 삭제 or 동적 server scale out...?)
- ngnix를 활용한 static image CDN server 구현
- 대규모, 대용량 이미지 다운로드 처리 (how? batch, webflux 통한 비동기, 동적 server scale out...?)
- MSA 배포 by k8s or 모듈/라이브러리화
'프로젝트' 카테고리의 다른 글
최종 프로젝트 트러블슈팅 + 기술적 의사 결정 (6) | 2024.11.14 |
---|---|
최종 프로젝트 회고 (3) | 2024.11.13 |
3차 프로젝트 2주차 WIL (0) | 2024.10.07 |
대규모 AI 시스템 설계 프로젝트 회고 (3) | 2024.09.25 |
스프링 심화 대규모 AI 시스템 설계 프로젝트 - Starting Assignments (0) | 2024.09.25 |