기존 구조와 문제점

Laravel : 벨리데이션 및 사이트 관련 api 서버
Node.js : 체결, 차트, 타코인 블록체인 연결 관련 서버
- Node.js 서버 부하 증가
- Node.js 서버가 체결, 차트, 블록체인 연결 등 다양한 작업을 담당하면서 발생하는 높은 부하, 특히 모든 코인에 대한 거래를 처리하는 체결 부분에서 성능 저하 문제가 발생
- 다중 서버 환경에서의 DB Lock 경합 문제
- Laravel과 Node.js가 동일한 DB를 사용하면서 트랜잭션 Lock 순서 불일치로 인한 Deadlock 및 성능 저하 발생
- 동기식 HTTP 통신의 신뢰성 문제
- Laravel에서 Node.js로 주문 이벤트를 HTTP로 전송 시, 네트워크 장애나 서버 다운타임에 따른 이벤트 유실 및 재시도 메커니즘 부재가 발생
- 집계 연산에 부적합한 데이터 저장 구조
- RDB만 사용하여 대량의 거래 데이터 집계(일일 평균가, 종가 등) 시 전체 테이블 스캔이 필요하고, NoSQL이나 시계열 DB 부재로 성능 저하가 발생
- 거래 금액 및 가격 데이터의 정밀도 보장 필요
- 부동소수점 연산 오류, BigDecimal 미사용 등으로 인한 금융 데이터 정확성 문제 및 타입 검증 체계 부족
개선 방안

- 마이크로서비스 아키텍처 도입을 통한 부하 분산
- Gateway, 주문, 사용자, 매칭, 리시버, 체결, WebSocket 서버로 기능별 분리
- 각 서비스별 독립적인 스케일링으로 체결 서버의 부하 집중 문제 해결
- 체결 성능 개선
- 비관적락, Redis 분산락, Lua 스크립트 단위로 비교 후 트랜잭션 최소화로 성능개선
- 미체결 수량 업데이트를 개별 이벤트 방식에서 스케줄러 기반 주기적 동기화로 변경
- Kafka 도입으로 이벤트 전송 신뢰성 확보
- HTTP 동기식 통신을 Kafka 비동기 메시징으로 대체
- 주문 및 코인별 파티션 분할로 대용량 주문 이벤트의 병렬 처리 성능 향상
- 특화된 데이터베이스 도입으로 성능 개선
- TimescaleDB: OLAP 성격의 차트 데이터 및 시계열 분석 최적화
- Cassandra: 대용량 체결 데이터의 빠른 쓰기와 영구 보관
- Spring Boot 전환을 통한 금융 데이터 타입 안정성 확보
- Node.js에서 Java/Spring Boot로 전환하여 강타입 언어의 컴파일 타임 체크
이러한 아키텍처 개선을 통해 기존 모놀리틱 구조의 한계를 극복하고, 초당 수만 건의 거래를 안정적으로 처리할 수 있는 확장 가능한 시스템을 구축했습니다.
시스템 디자인

- Gateway에서 인증/인가 처리 후 주문 서버로 요청 전달
- 주문 서버에서 유효성 검증 후 Kafka를 통해 유저 서버로 전송