나도 다른 사람들 플젝 하는거 올리니까 자극되서 계획하던거 올려봄.
자프링 입문한지 2개월 된거라 아직 잘 모르는데 피드백 주면 써도 달게 받음.
로드맵은 총 6단계로 우선은 계획중이고
mvp후 나머지 5단계는 점진적 개선을 위한 단계로 알면됨.
이대로 그대로 할건 아니고 진행 하기전 계획을 어느정도 잡은거라고 보면 됨.
일단 ERD/ DDL/ 정책 / 트랜잭션 플로우 까지 끝내서 시퀸스만 정립하고 바로 들어갈듯.
0. 인프라 및 환경 구성
목표 : 최소한의 비용으로 환경 구축하기
테스트 환경 : windows 11 + WSL2 (Ubuntu 22.04)
개발은 Macbook (맥에서 테스트하고 모니터링 하고 다같이 하기에는 부하 측정의 결과가 믿을만 하지 못했어서)
리소스 제어 : Docker compose 로 실행하되, 리소스 제한으로 저사양 인스턴드 환경 구현
구성은
메인 - Java 17, Spring Boot
봇 - Java(쓰레드 공부할겸) or Python
기타 - MySQL , Redis, RabbitMQ or Kafka
모니터링 - Prometheus + Grafana
실제 AWS 배포 테스트는 5단계 WebFlux 도입 후 로 예상
---------------------------------------------------------
1. MVP + 미러링 봇
목표 : 거래소 코어 기능 구현 및 업비트 시세 추종
아키텍쳐 : Spring MVC + MySQL
초기 제약조건을 PK/FK/Unique 정도만 해서 빠르게 MVP 마무리 (2주 예상)
하나의 트랜잭션으로 동기적으로 모든 로직 처리
미러링 봇
1. 업비트 websocket으로 실시간 호가 받아오기
2. 현재가 기준으로 지정가 주문 생성
3. 주기적으로 시장가 주문 강제 체결로 시세 형성
4. 가격 급등시 cancel하고 재주문하기
로 구성.
검증지표는 JUnit으로 테스트 코드 통과
-----------------------------------------------------
2. 정합성 강화
목표 : 금융 시스템 수준의 데이터 무결성 확보
예상되는 문제는
1. 동시 주문으로 경합 문제가 생겨 잔고가 마이너스가 되거나 꼬이는 문제.
2. 주문 체결이 딜레이 되면서 무한 로딩에 걸리는 문제.
메인:
1. Strict DDL 적용 (DB레벨의 검증이나 인덱스 등)
2. Update 가 아닌 모든 자산변경 이력을 원장에 Insert 하고 합산 검증
3. 비지니스 예외 처리
4. 트랜잭션 격리 수준 검토
검증 지표는 동시성 테스트 시나리오
--------------------------------------------------
3. 캐싱 전략과 성능 최적화
목표 : p95 응답 속도를 100ms 이하로.
예상되는 문제는
1. 메인 접속 시 현재가(Ticker) 및 호가 (Order Book) 조회 쿼리로 DB CPU 폭주 예상.
메인:
Redis 도입
- 호가는 Sorted Set 활용
- 현재가는 체결 발생 시 Hash 자료주고 업데이트
Write-Through 방식으로 체결엔진이 DB 저장과 Redis 갱신을 동시에 처리하게끔.
Slow Query Log 분석으로 인덱스 최적화
검증 지표는 K6 부하 테스트 (유저 90% + 봇 10% 트래픽)
이떄 기준치는 실제 업비트 mau 리서치 해서 역산할 예정.
--------------------------------------------------------------------
4. 매칭 엔진 고도화 및 동시성 제어
목표 : DeadLock 0건 + TPS 극대화
예상되는 문제점
1. 주문량 폭증 시 DB Row Lock 경합으로 인한 체결 지연 및 데드락 발생.
메인 :
충돌이 적은 경우에는 Optimistic Lock 도입
핫한 자산의 잔고 차감 시에는 Redisson 도입
DB 쿼리 매칭을 In-Memory (Java Priority Query) 기반 매칭으로
@Async 를 통해서 주문 접수와 체결의 스레드를 분리
검증 지표는 봇의 트래픽을 올려서 데드락 발생 여부와 TPS를 측정 비교
-------------------------------------------------------------------
5. 논 블로킹 아키텍쳐로 전환
목표 : 동일 인스턴스에서 동시 수용량 N배 증가 및 AWS 배포
예상되는 문제점
Tomcat 스레드 풀 고갈 및 Context Switching 오버헤드
메인:
Spring MVC 를 Spring WebFlux 로 전환.
DB 드라이버를 비동기로 전환해서 I/O 블로킹 제거
SSE / WebSocket으로 체결 내역과 호가창 실시간 업데이트
로컬에서 AWS 배포로
검증 지표는 로컬 환경에서 MVC 대비 접속자 수 비교 와 로컬 환경 과 AWS 배포 환경의 동시 접속자수 비교
++ 가능하다면 이떄 코틀린으로 변경? (아마 안할듯?)
---------------------------------------------------------------------------
6. MSA + 내결함성
목표 : Single Point of Failure 제거 및 장애 전파 차단
예상되는 문제점
매칭 엔진이 멈추면 모든 시스템이 멈추는 단일 실패 지점이 발생하여 장애전파 발생.
메인:
인증 서버 <> API 서버 <> 매칭 엔진 서버 <> 소켓 서버를 분리.
RabbitMQ 나 Kafka를 도입해서 이벤트 기반 아키텍쳐로 전환.
> 주문 -> 메시지 큐 -> 매칭 엔진 -> 메시지 큐 -> 정산 및 알림
검증 지표는 의도적인 매칭 엔진의 다운에도 조회 및 주문 접수 가능한지 테스트
--------------------------------------------------------------------------------
기존의 프로젝트에서 좀 못해봤던거랑 gpt 사용해서 계획을 좀 세웠음.
아마 모니터링 쏙에서 좀더 가서 예거나 쓰레드 덤프 분석 까지도 좀 해볼가 싶은데
아직 모니터링도 제대로 파악하지 못해서 이거는 하면서 딥다이브 해볼예정.
중간에 뭔가 이거는 왜필요하나 같거나 빠진 부분이나 개선할거 있으면
뭐든 피드백으로 받겠음미다.
ai한번돌려서 MD형식이나 명세서형식이나 그런걸로 올려주는게 더 좋을것같음 애당초 ai가 돌려주면 핑까도해줌
ai 는 맨날 좋게 평가해주더라 원래 노션이었는데 그대로 붙이면 다 꺠져서 정리해서 옮겼지
나눠서해봐 1은 스펙 정리 표준규격이나 제일 잘쓰는 서식 오픈소스에서 기술서 기술스펙 정의서 이런걸로 정리해달라하고 여기까지는 무조건 ai를 써서 해야한다는게 요즘트렌드에 살아남을수있는 방법이라생각함 글 서두에 가시성은 좀 별로인데 << 이거자체가 안나올거라서 핑까는 그다음임 님 말대로 ai는 무조건 좋게말해주는데 최대한 까달라하고 최악의 시나리오해달라하면 그것도해줌 그럼 그거는 의도된 사항인가 의도된 한계인가 어디까지 케어하고 케어하지 않도록 방향을 정했나 명확히 할수있음
@나가토다이묘진 아하 감사감사 어느정도 문서화는 이미 해두긴했는데 한번더 정리해봐야겠다
@나가토다이묘진 일단은 ai로 생산성을 좀 높여보고 피드백도 받고 해야겠다
거래소면 논블로킹이랑 블로킹 나눠써야하지않낭?
그니까 값계산하는 로직이 거래소면 있을수도 있을거같은뎅
ㅇㅇ 주문은 논블로킹이고 체결은 블로킹으로 할려고 나중에 체결자체는 in-memory로 할거라
주제의 범위가 크면 산으로 가 좁고 작은 문제를 깊게 해결해바 - dc App
결국에는 파트마다의 문제는 명확할거같아서 파트파트 마다 좁은 주제로 해서 가져갈건데 지금도 너무 클가?
@1일1행 뭐 다양하게 해보는건 좋지만 결국 포폴화 및 면접에서 나누는 대화는 특정 문제를 어떻게 해결했는지를 봄 이러한 상황에서의 문제를 이렇게 해결했다고 한줄로 이야기가 되야해 - dc App
@딘퐁 그러면 노선을 좀 정해야 겠구나 사실 거래소 하는 목적 자체가 좀 광범위하게 커버가 되겠다 싶어서 한거거든 금융쪽 도메인해봤도르 , 데이터 정합성 챙기고, msa+kafka 맛보기, 인프라도 그렇고 대규모 트래픽도 그렇고
@1일1행 이게 내가 지식도 얕고 경험도 얕다보니까 뭘 집중해야하고 이런게 잘 안스는거 같네..
@1일1행 내가 보면서 드는 생각이 딱 그거임 실무에서 제대로 구축하려면 하나하나가 몇달치 프로젝트인데 거기서 면접관이 만족할만한 수준까지 보여줄 수 있냐는거지 - dc App
@1일1행 프로젝트 crud 구현은 알아서 잘하되 트러블 슈팅은 좁고 깊게 접근하는게 여러모로 유리하다는거지 - dc App
@1일1행 실무에서도 특정 문제가 되는 튀는 애들만 잡지 전체 시스템을 갈아엎는건 불가능함 - dc App
@딘퐁 그치... 말 들으니까 좀 과한건 맞는거 같음 뭔가 좀 핀포인트로 해야하는데 이게 뭘로 해야할지도 되게 애매하다고 해야할가... 님처럼 db쪽으로 아예 파고들거나 좀 그래서 전문성을 높여야 하는데 잘 모르니까 최대한 잡부로써 한다는 느낌이 강하달가... 아예 맨 처음 생각대로 도메인 이해도 + 정합성만 딥하게 하는정도면 괜찮을가? 나머지는 타협한다고 하고? 걍 다 애매하니까 뭘 하나 고르기에 무섭다
메시지큐로 주문 넣으면 타이밍 밀려서 가격 손해보거나 하지 않음? 주식은 모르겠는데 코인은 분명 문제 생길것 같은데
아 내가 글을 잘못봤다