/////
Search
Duplicate

24년 1월 30일 화요일

날짜
2024/01/30

불필요한 Delete 쿼리 → Soft Delete 로 리팩토링

문제

현재 불필요한 DELETE 처리가 수행되고 있음
불필요한 DELETE 처리를 SOFT DELETE로 리팩터링하기로 함

해결방안

시스템 내에서 DELETE가 나가는 상황들
구매입찰 취소요청
구매입찰 데이터 자체를 삭제
판매입찰 취소요청
판매입찰 데이터 자체를 삭제
즉시구매 요청
판매입찰 조회, 주문 생성 => 이후 판매입찰 삭제
판매입찰 스케줄러
기한을 지난 판매입찰 삭제
구매입찰 스케줄러
기한을 지난 구매입찰 삭제
환급요청 처리
환급 데이터 삭제
아래와 같이 변경하기로 함
엔티티에 삭제처리에 대한 flag 필드를 추가
삭제처리에 대해서 삭제처리 flag 필드를 체크하기로 함
BaseEntity 확장/상속관계
조회 시, 삭제처리된 데이터들을 포함하지 않게끔 쿼리문을 변경
변경해야하는 코드 스코프가 넓음
우선순위가 높은 것 같지 않으니, 가장 중요한 성능개선 처리 후 최대한 빨리 구현하자

서비스가 돌아가고 있는 중, Merge 와 Deploy는 어떻게?

문제

서비스가 실행되고 있어 Merge 와 Deploy가 제한적임
만약 서비스 전체를 변경할만큼의 스코프 변경이라면 어떻게 해주어야할까?

해결방안

서비스 전체를 변경할만큼의 스코프 변경이라면, 서비스 마감의 마지막에 적용하기로 함
merge는 바로바로 하되, deploy는 prometheus 를 붙이고 모니터링 세팅 완료한 후 deploy 처리!

우리 상황에 어떤 Caching 전략이 어울릴까?

문제

다량의 트래픽에 따른 성능을 개선하고자, 캐싱처리를 하고자 한다.
이 때, 다음과 같은 유의사항을 고려해야한다.
어떤 비즈니스 요구사항이 가장 자주 참조되는가?
그렇다면 해당 요구사항에 따라 캐싱 target data는 무엇으로 할 것인가?
캐싱 보관 데이터의 만료 정책은 어떻게 할 것인가?
데이터정합성(일관성), 즉 RDB와의 동기화은 어떻게 처리할 것인가?
장애에는 어떻게 대처할 것인가?
캐시 메모리는 얼마나 크게 잡을 것인가?
데이터 방출 정책은 무엇인가?
조사한 전략 중 어떤 것을 선택할 것인가?
읽기 전략
Look Aside
Read Through
쓰기 전략
Write Back
Write Through
Write Around

해결방안

다량의 트래픽에 따른 성능을 개선하고자, 캐싱처리를 하고자 한다.
이 때, 다음과 같은 유의사항을 고려해야한다.
어떤 비즈니스 요구사항이 가장 자주 참조되는가?
상품 데이터 조회 ⇒ 캐싱처리
상품 종류가 많지 않아서 애매모호함
상품 이미지 조회 ⇒ Cloud Front 로 CDN 처리함
최근 검색 기록 ⇒ 캐싱처리
상품 랭킹 ⇒ 캐싱처리
지난 일주일 간 { 판매입찰 + 구매입찰 + 주문 } 전체건수량에 따른 랭킹
그렇다면 해당 요구사항에 따라 캐싱 target data는 무엇으로 할 것인가?
상품 데이터
상품명
상품브랜드
즉시구매가 (가장 낮은 판매희망가)
즉시판매가 (가장 높은 구매희망가)
전체 체결거래가
전체 판매입찰가
전체 구매입찰가
최근 검색 기록
로그인한 유저의 검색기록
상품 랭킹
전체 상품에 대해, 지난 일주일 간 { 판매입찰 + 구매입찰 + 주문 } 전체건수량에 따른 랭킹
캐싱 보관 데이터의 만료 정책은 어떻게 할 것인가?
TTL
어느 정도로 잡으면 좋을지 가늠이 잘 안 됨
일단 CloudFront 를 따라해보자
최소 TTL은 60초, 기본 TTL은 300초로 , 최대 TTL은 3600초
데이터정합성(일관성), 즉 RDB와의 동기화은 어떻게 처리할 것인가?
조사한 전략 중 선택할 예정
장애에는 어떻게 대처할 것인가?
캐시 서버를 한 대만 두면 SPOF가 발생할 가능성이 있다
최소 3개의 분산서버를 사용
1개의 마스터 노드와, 1개 이상의 복제본(Replica)를 두고, 각 노드에도 각각 센티널을 두어 자동 페일오버 처리
캐시 메모리는 얼마나 크게 잡을 것인가?
메모리가 너무 작으면 액세스 패턴에 따라 데이터가 밀려나버려 캐시 성능이 떨어진다.
규모에 따라 상이함
소규모 : 100MB ~ 1GB
중규모 : 1GB ~ 10GB
대규모 : 100GB ~
우리의 상황상 t3.small 정도의 메모리가 적합하다고 판단했음
t3.small 1.37 GB
데이터 방출 정책은 무엇인가?
Redis 방출 정책은 다음과 같음
No Eviction
LRU
LFU
Random Eviction
TTL
이 중 어떤 걸 쓸까?
상품 데이터 : No Eviction이 적합
데이터 보존용으로 처리하기 때문
최근 검색 기록 : LRU 적합
접속한지 오래된 사용자의 검색기록을 삭제하면 적합하게 처리할 수 있음
상품 랭킹 : LFU 적합
랭킹 : 지난 일주일 간 { 판매입찰가 + 구매입찰가 + 주문건수량 } 합
key : 1위 ~ 10위 ⇒ value : 상품
스케줄링 vs 조회할 때 연산 ( 쿼리,스레드 낭비 )
스케줄링에 대해서 검증처리해주어야함
로직 스케줄링
입찰기한이 지나면 데이터 삭제 스케줄링
안 돌아버리면??
⇒ 입찰건 조회 후 주문 처리 비즈니스에 악영향
“주문처리 비즈니스 내에서 입찰건 조회 시, 마감기한이 기난 입찰을 배제하는 검증 로직이 필요하다”
현업에서 스케줄러 안 돌면 ⇒ 실제 사람이 달려가서 쿼리 날려줌
스케줄링
관리 허들 UP
스케줄링 인스턴스 분리해야함
조회마다 연산
로그 테이블을 따로 만들어서 COUNT 쿼리로 쳐버리면 뚝딱
초기 요청에 대한 핸들링은 해야하지만
TTL에 따른 캐싱 처리
방출 정책 : TTL 적합
가장 조회 빈도수가 적은 상품의 랭킹을 방출하기
No Eviction X
Random Eviction X
조사한 전략 중 어떤 것을 선택할 것인가?
읽기 전략
Look Aside
Read Through
쓰기 전략
Write Back
Write Through
Write Around

앞으로 최종 발표까지 할만한 컨텐츠

문제

재윤님이 프론트만, 규빈님이 인프라만 담당하느라 백엔드 부분에 참여를 하지 못함

해결방안

알림 기능을 재윤님 및 규빈님이 담당하여 개발하기로 함. 아직 기획 및 설계는 정하지 않음.
규정님은 테스트 코드를 작성하여 자코코 커버리지 비율 높이기.
지훈님은 현재 자리 비운 상태라 이후 논의를 하기로 함.

내일 무슨 주제로 피드백을 요청드릴까?

문제

제곧내 ㅎㅎ

해결방안