
배경리워드 시스템을 고도화하며 발급 정책을 추가하는 작업이 필요하게 되었다.분석하다 보니 기존 시스템은 발급 구조에 대해 여러가지 잠재적인 이슈가 있는 것으로 보여 보다 안전한 구조로 개선하기로 했다. 현황 분석아래 구조는 실제 구조는 아니고 생략할 부분은 생략하고 일부는 변형해서 비슷한 예시를 만들어보았다.기존의 리워드 발급 구조는 위와 같다.1. 클라이언트에서 가지고 있는 정책 코드를 기준으로 서버에서 정책에 대한 세부 내용을 요청한다.2. 1에서 응답받은 리워드 수량만큼 리워드 발급 요청한다. 예를 들면 특정 컨텐츠에 댓글을 달면 리워드를 발급하는 기능이 있다고 가정해보자.이 경우 클라이언트 영역에서는 댓글 등록 API를 호출하여 성공 응답을 받고 난 뒤, 댓글 등록에 대한 정책 코드 "0001..

이슈 발생Jennifer 모니터링 중 리워드 발급 관련 API에서 지속적으로 에러가 발생하는 것을 발견하여 분석해보았다.정확한 현상은 두 개 이상의 리워드 발급 요청이 동시에 들어오는 경우 DuplicatedKeyError가 발생하는 현상이었다. 원인 분석리워드 이력 테이블의 PK는 대리키로 만들어진 bigint 타입의 컬럼인데 auto_increment가 적용되어 있지않은 상태였다.insert 쿼리 시 서버 어플리케이션에서는 max+1 값을 조회해서 PK value로 넣어주는 방식으로 구현되어 있었다. 이 방식의 문제는 크게 두 가지가 있다.첫 번째는 insert를 위해 select max(PK) 연산이 수행되어야 하기 때문에 최적화가 어렵다는 점이다.두 번째는 동시에 들어온 요청은 동일한 max(PK..

서버 어플리케이션을 배포하거나 트래픽 집중상황에서 스케일링되는 경우에 거래 응답시간이 튀는 현상이 발생하였다.스케일링되는 환경은 AWS EKS에서 MSA로 구성된 서비스이다. APM Tool은 Jennifer를 사용하였으며 실제 데이터 대신 임의의 데이터로 포스팅한다. 1차 분석 및 개선파드가 scale-out 될 때 새롭게 생성되는 파드에서 API 응답이 지연되었다.파드가 정상적으로 떠있는 상황이 아닌데 트래픽이 인입되는 것이 아닐까라는 생각이 들어서 healthcheck 관련 probe 설정을 확인해보았다.readinessProbe: httpGet: path: /healthcheck port: 8080 initialDelaySecond: 15 periodSeconds: 30 time..