목록Spring (4)
코딩 해파리

들어가며현재 프로젝트 목표 중에 높은 트래픽 상황을 견디며 처리하는 성능이 좋은 서버를 구축하는 부분이 있었습니다. 하지만, 기존에는 주문 생성 이벤트가 들어올 때마다 매번 DB에 쓰기 작업을 수행하도록 설계되어 있었기 때문에, 주문이 발생하였을 때 상품 재고 감소 처리 로직(재고 차감 로직)에서 심각한 성능 저하가 발생했습니다. 이렇게 많은 이벤트를 단건 단위로 처리하다 보니, 트래픽이 폭주할 때 자원 사용량 증가로 시스템 전반에 병목 현상이 생겼습니다.이 글에서는 이벤트 배치 처리 방식을 도입하여 성능을 최적화한 과정을 공유합니다. 기존 문제점N건의 이벤트에 대해 N번의 DB 쓰기주문 생성 이벤트가 1건 들어올 때마다 상품 서비스에서 재고 차감 로직을 실행 → DB에 직접 쓰기.이벤트가 폭발적으로 증..

원래의 시스템주문 서비스는 주문 데이터 처리 후, 상품 서비스에 재고 차감 요청(REST)을 보냅니다.이후 주문 서비스 내에 스케줄러가 주기적으로 pending 상태의 주문들을 확인하여, 5분 내 결제 완료 웹훅이 주문 서비스에 오지 않으면 결제 실패로 판단하고, 상품 서비스에 재고 복원(증가) 요청을 다시 보냅니다.5분 내에 결제 완료 웹훅이 오면 주문이 성공하게 됩니다. 문제점주문 실패나 결제 실패 같은 예외 상황에서, 상품 서비스에 “재고를 되돌려 달라”는 추가 REST 요청을 해야 합니다.매 주문마다 상품 서비스를 동기적으로 호출하고, DB에 재고 차감이라는 쓰기 작업을 하는 시간까지도 기다려야 하기 때문에, 트래픽이 한 순간 몰릴 경우 상품 주문을 한 사용자에게 응답이 매우 늦게 올 것이며 서버..

들어가며이 포스팅은 "MSA 환경에서 이벤트를 주고받으며 프로세스를 진행할 때 발생할 수 있는 데이터 정합성 불일치 문제 발생"을 주제로 합니다. 제 졸업 프로젝트에서 MSA를 적용할 때, 서비스를 분리하기만 하면 끝나는 줄 알았지만 실제론 이벤트가 중복 처리되거나 외부시스템(DB)이 커밋을 실패하거나... 하는 등의 이유로 전체 데이터 정합성이 깨질 수 있는... 곤란한 일이 생길 수 있다는 사실을 깨닫고 많은 고민을 하며 해결했던 과정을 정리해보았습니다.1. 네트워크와 브로커는 100% 신뢰가 어렵다네트워크 장애로 인하여 패킷 손실 혹은 타임아웃 등으로 인해 오프셋이 커밋되지 않는 등의 이유로 재전송이 여러 번 이뤄져 중복 이벤트 컨슘 상황이 발생할 수 있습니다. 또한, 모종의 이유로 이벤트를 발행한..

언어: javaSpring Boot ver: 3.3.4IDE: intelliJSDK: JDK 21의존성 관리툴: GradleMac 안녕하세요!이번엔 포스트를 장기적으로 여러개를 작성하게 될 것 같습니다…!일단 이번에 작성할 내용은 이미 개발한 스프링 부트 기반 프로젝트를어떻게 하면 간단하게 AWS사의 EC2, Google사의 VM인스턴스 등등의 가상머신에 띄울 수 있을까요?분명 여러가지 방법이 있습니다. AWS사 혹은 GCP(Google)사의 관리형 프로그램을 사용하여 배포하는 방법JAR 파일을 직접 전송해서 가상머신에서 실행하는 방법스프링부트 프로젝트를 도커(Docker) 이미지로 만들고 푸쉬(push)하고, 가상 머신에서 그 이미지를 풀(pull) 해서 실행하는 방법 - Docker Hub, GHCR..