KoCoinEx 배포 구성

관리형 서비스를 걷어내고 EC2 한 대에 컨테이너 21개로 통합한 거래소

KoCoinEx 배포 구성 관리형 서비스를 걷어내고 EC2 한 대에 컨테이너 21개로 통합한 거래소 AWS ap-northeast-2 EC2 r7g.large 1대 — 컨테이너 21개 이용자 브라우저 · 거래 · 관리자 · 대리점 · Architecture component 이용자 브라우저 거래 · 관리자 · 대리점 CloudFront ×3 · exchange / admin / agent · AWS ap-northeast-2 CloudFront ×3 exchange / admin / agent Caddy · SNI 로 앱 구분 · TLS · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Caddy SNI 로 앱 구분 · TLS Next.js 앱 3개 · 거래 · 백오피스 · 대리점 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Next.js 앱 3개 거래 · 백오피스 · 대리점 Go Gateway · JWT 검증 · 요청 제한 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Go Gateway JWT 검증 · 요청 제한 Go API 서비스 10개 · 주문 · 회원 · 지갑 · 시세 · 정산 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Go API 서비스 10개 주문 · 회원 · 지갑 · 시세 · 정산 마켓메이킹 봇 · Binance · OKX 기준가로 호가 생성 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 마켓메이킹 봇 Binance · OKX 기준가로 호가 생성 Kafka · 주문 · 체결 · 취소 토픽 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Kafka 주문 · 체결 · 취소 토픽 Rust 매칭 엔진 · 심볼마다 전용 스레드 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Rust 매칭 엔진 심볼마다 전용 스레드 MySQL 8.0 · 주문 · 체결 · 지갑 (102개 표) · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 MySQL 8.0 주문 · 체결 · 지갑 (102개 표) Redis 7 · 시세 캐시 · 분산 잠금 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 Redis 7 시세 캐시 · 분산 잠금 MongoDB 7 · 채팅 · 시세 이력 · AWS ap-northeast-2 › EC2 r7g.large 1대 — 컨테이너 21개 MongoDB 7 채팅 · 시세 이력 HTTPS 원본 분리 페이지 접두사 제거 라우팅 주문 체결 봇 주문 Legend Frontend Backend Database Cloud Security Message bus External

한 대에 무엇이 들었나

  • • Rust 매칭 엔진 1 + Go 서비스 11 + Next.js 앱 3
  • • MySQL · Redis · MongoDB · Kafka · ZooKeeper 도 같은 컨테이너로
  • • 매칭 엔진은 심볼마다 전용 OS 스레드를 띄우고 채널로 주문을 받는다

왜 관리형을 뺐나

  • • RDS · ElastiCache · MSK · ECS · ALB 를 전부 걷어냈다
  • • 비용의 대부분은 트래픽이 아니라 켜져 있다는 사실에서 나온다
  • • 데모에 필요한 건 다중 AZ 이중화가 아니라 눌렀을 때 뜨는 것

경계에서 생긴 일

  • • CloudFront 가 Host 헤더를 그대로 넘기면 Caddy 가 갈 곳을 못 찾아 502
  • • TLS 는 통과하므로 인증서는 멀쩡해 보인다 — 증상이 헷갈리는 이유
  • • 원본 이름을 앱마다 따로 둬 연결 단계에서 갈라지게 했다

오더북은 메모리에만 있다

  • • 엔진이 죽으면 오더북은 사라지는데 DB 주문은 '거래중' 으로 남는다
  • • 재기동 80분 뒤 미체결의 94~98% 가 재기동 이전 것이었다
  • • 그래서 기동할 때 MySQL 의 미체결을 오더북으로 되돌린다