본문 바로가기
나의 IT 기억

Redis 말고 공유 메모리? 웹서버 여러대에서 증권 시세를 빠르게 공유하는 새로운 방법

by 浪畅 (Làng Chàng) 2025. 6. 1.

 

 

https://github.com/onesound71/stock_shared_memory

 

안녕하세요! 오늘은 웹서버 간 실시간 증권 시세를 공유하는 조금 다른 접근법에 대해 이야기해보려고 합니다.

 

 

GitHub - onesound71/stock_shared_memory

Contribute to onesound71/stock_shared_memory development by creating an account on GitHub.

github.com

 

왜 이 글을 쓰게 되었나요?

웹서버에서 실시간 주식 데이터를 공유하려고 하면, 대부분 Redis를 먼저 떠올리시죠? 저도 그랬습니다. 하지만 프로젝트를 진행하면서 "정말 Redis가 항상 최선일까?"라는 의문이 들었어요.

특히 초고속 처리가 필요한 상황에서 Redis의 네트워크 오버헤드가 아쉬웠습니다. 그래서 공유 메모리(Shared Memory)를 활용한 방법을 실험해봤는데, 결과가 생각보다 좋아서 여러분께 공유드리고 싶어요.

 

여러게 웹서버 시세 가격 비교
공유 메모리 수정하는 모습

 

Redis vs 공유 메모리, 뭐가 다를까요?

🔴 Redis의 장단점

장점:

  • 네트워크를 통한 분산 환경 지원
  • 데이터 영구 저장 가능
  • 다양한 데이터 구조 지원
  • 풍부한 커뮤니티와 생태계

단점:

  • 네트워크 지연시간 (보통 1ms 내외)
  • 추가 인프라 관리 필요
  • 메모리 사용량이 상대적으로 높음

🟢 공유 메모리의 장단점

장점:

  • 극도로 빠른 속도 (마이크로초 단위!)
  • 추가 인프라 불필요
  • 메모리 효율적 사용
  • 구현이 상대적으로 간단

단점:

  • 같은 서버에서만 동작
  • 데이터 영구 저장 불가
  • 프로세스 간 동기화 신경써야 함

실제로 얼마나 빠를까요?

제가 테스트해본 결과입니다:

방식 평균 지연시간 초당 처리량 용도
Redis ~1ms 높음 분산 환경
공유 메모리 ~1μs 매우 높음 단일 서버

무려 1000배 차이가 나네요! 물론 용도에 따라 다르지만, HFT(고빈도 거래)나 실시간 게임 같은 곳에서는 이 차이가 매우 중요합니다.

어떻게 구현했을까요?

파이썬으로 간단한 예제를 만들어봤습니다. (쉽게 테스트해보라는 의도예요!)

핵심 아이디어

import mmap
import struct

# 공유 메모리 파일 생성
with open('/tmp/stock_shared_memory', 'r+b') as f:
    mm = mmap.mmap(f.fileno(), 128)

    # 주식 가격 저장 (AAPL = $150.00, 변동률 = +2.5%)
    struct.pack_into('dd', mm, 0, 150.00, 2.5)
    mm.flush()  # 즉시 동기화!

시스템 구조

┌─────────────────────────────────────────┐
│          공유 메모리 파일                │
│      /tmp/stock_shared_memory           │
│                                         │
│  [AAPL][GOOGL][MSFT][TSLA][AMZN]...   │
│   price change price change price...    │
└─────────────────────────────────────────┘
           ↑        ↑        ↑
    ┌─────────┐ ┌─────────┐ ┌─────────┐
    │리더 서버│ │팔로워1  │ │팔로워2  │
    │(8000)   │ │(8001)   │ │(8002)   │
    │ 쓰기+읽기│ │ 읽기 전용│ │ 읽기 전용│
    └─────────┘ └─────────┘ └─────────┘

실제 사용해보기

1. 서버 실행

# 간단한 스크립트로 한 번에!
./run_servers.sh
# 선택: 1 (공유 메모리 모드)

2. 실시간 가격 수정

python3 stock_editor.py

# 편집기에서
💭 명령어 입력: AAPL 999.99
🧠 공유 메모리 직접 업데이트: AAPL: $150.00 → $999.99 (+566.66%)

3. 웹에서 확인

모든 서버에서 즉시 업데이트된 가격을 볼 수 있어요!

언제 사용하면 좋을까요?

✅ 공유 메모리가 좋은 경우

  • 단일 서버에서 멀티 프로세스 환경
  • 극도로 낮은 지연시간이 필요한 경우
  • 고빈도 데이터 업데이트 (HFT, 실시간 게임)
  • 간단한 구조로 빠른 구현이 필요한 경우

❌ Redis가 더 나은 경우

  • 여러 서버에 분산 배포 필요
  • 복잡한 트랜잭션 처리
  • 데이터 영구 저장 필요
  • 다양한 데이터 구조 활용

다른 기술들과 비교해보면?

비슷한 역할을 하는 다른 기술들도 있어요:

  • System V 공유 메모리: 더 저수준, C/C++에서 주로 사용
  • Apache Kafka: 이벤트 스트리밍, 더 복잡한 설정
  • Hazelcast: 자바 기반, 더 무거운 솔루션

각각 장단점이 있지만, 간단함과 속도를 원한다면 mmap 기반 공유 메모리가 좋은 선택이에요.

실제 프로덕션에서 사용할 때 주의사항

  1. 동기화: 여러 프로세스가 동시에 쓸 때 락(Lock) 필수
  2. 에러 처리: 메모리 파일 손상 시 복구 로직 필요
  3. 모니터링: 메모리 상태 실시간 감시
  4. 백업: 중요한 데이터라면 별도 백업 전략

마무리

Redis는 분명 훌륭한 도구지만, 모든 상황에 만능은 아니에요. 단일 서버 환경에서 극도의 성능이 필요하다면 공유 메모리도 좋은 대안이 될 수 있습니다.

파이썬으로 예제를 만든 이유는 누구나 쉽게 테스트해볼 수 있도록 하기 위해서예요. 혹시 다른 언어(C++, Java, Go 등)로 변경해보고 싶으시거나 어려움이 있으시면 댓글이나 쪽지 남겨주세요! 다양한 방법을 더 올리거나 설명드리겠습니다.


📦 전체 소스코드

완전한 예제 코드와 실행 방법은 아래에서 확인하실 수 있어요:

주요 파일들:

  • main.py - FastAPI 기반 메인 서버
  • stock_editor.py - 실시간 가격 편집기
  • run_servers.sh - 서버 실행 스크립트

지원 기능:

  • ✅ 8개 주식 실시간 추적 (AAPL, GOOGL, MSFT 등)
  • ✅ 반응형 웹 대시보드
  • ✅ HTTP API + 공유 메모리 두 가지 모드
  • ✅ Docker 지원

여러분도 한번 시도해보시고, 어떤 방식이 더 적합한지 비교해보세요!

끝.