인프라 개요

이 문서는 Thinvent 공개 웹사이트를 구동하는 인프라에 대한 포괄적인 개요를 제공합니다. 웹 서버부터 데이터베이스 계층까지 완전한 기술 스택을 다루며, 모든 구성 요소가 어떻게 함께 작동하여 빠르고 안정적이며 확장 가능한 전자상거래 경험을 제공하는지 설명합니다.

웹 애플리케이션 스택

Flask - 기반

우리 웹사이트는 가볍고 유연한 Python 웹 프레임워크인 Flask를 기반으로 구축되었습니다. Flask는 핵심 라우팅, 요청/응답 처리 및 애플리케이션을 모듈식 구성 요소로 구성하는 블루프린트 시스템을 제공합니다.

우리가 사용하는 주요 Flask 기능:

  • Blueprints: 애플리케이션을 논리적 모듈(웹, API, 장바구니, 제품 등)로 구성

  • Jinja2 템플릿: 템플릿 상속을 통한 서버 측 HTML 생성

  • Request context: HTTP 요청 및 세션의 자동 처리

  • Werkzeug: 개발 서버 및 유틸리티 함수

Flask 애플리케이션은 다음을 수행하는 웹 모듈에서 초기화됩니다:

  • 웹 블루프린트 생성

  • 국제화를 위한 Babel 초기화

  • Valkey 세션 저장소 구성

  • 템플릿 변수를 위한 컨텍스트 프로세서 설정

Gunicorn - 프로덕션 서버

프로덕션 환경에서는 Python WSGI HTTP 서버인 Gunicorn (Green Unicorn)을 사용합니다. Gunicorn은 여러 작업자 프로세스로 Flask 애플리케이션을 실행합니다.

Gunicorn은 충돌 또는 서버 재부팅 시 자동으로 재시작되도록 보장하는 systemd에 의해 관리됩니다. 이를 통해 수동 개입 없이 높은 가용성을 확보합니다.

Nginx - 리버스 프록시 및 로드 밸런서

Nginx는 우리의 리버스 프록시 및 로드 밸런서 역할을 합니다. Gunicorn 앞에 위치하여 다음을 처리합니다:

  • SSL/TLS 종료: HTTPS 암호화/복호화

  • 정적 파일 제공: CSS, JavaScript, 이미지 (디스크에서 직접 제공)

  • 리버스 프록시: 동적 요청을 Gunicorn으로 전달

  • 속도 제한: 악용으로부터 보호

  • 요청 압축: 더 빠른 전송을 위한 Gzip 압축

Ubuntu - 운영 체제

모든 EC2 인스턴스는 우리가 선택한 Linux 배포판인 Ubuntu를 실행합니다. 가능한 경우 pip보다 Ubuntu python 패키지를 사용하는 것을 선호합니다.

일반적인 요청 흐름은 다음과 같습니다:

flowchart LR
    A[클라이언트 브라우저] -->|HTTPS 요청| B[Nginx]
    B -->|프록시| C[Gunicorn]
    C -->|WSGI| D[Flask 앱]
    D -->|쿼리| E[Valkey 캐시]
    E -->|미스| F[DynamoDB]
    F -->|응답| E
    E -->|히트| G[응답]
    G --> B
    B -->|응답| A

CloudFront - 콘텐츠 전송 네트워크

CloudFront는 우리의 CDN으로 다음을 제공합니다:

  • DDoS 보호: 분산 공격에 대한 내장 보호

  • Origin shielding: 트래픽 급증으로부터 원본 서버 보호

우리의 CloudFront 배포에는 두 개의 오리진이 있습니다:

  • 백엔드 서버: 백엔드 Flask 앱

  • S3: 정적 자산용 S3 버킷

구성된 캐시 동작:

  • /s/* - 정적 자산 (CSS, JS, 이미지), 24시간 TTL

  • /ds/*.pdf - 데이터시트, 24시간 TTL

  • /api/* - API 엔드포인트, 캐싱 없음

  • /cart - 장바구니, 24시간 TTL

  • /set-language - 캐싱 없음 (동적)

데이터 계층

DynamoDB - 기본 데이터베이스

우리는 기본 데이터베이스로 Amazon DynamoDB를 사용합니다. DynamoDB는 NoSQL 데이터베이스입니다.

우리의 DynamoDB 테이블에는 다음이 포함됩니다:

  • 추천사항: AI 생성 제품 추천

  • 제품 설명: 여러 언어로 된 제품 설명

  • 쿼리 페이지: SEO를 위한 파싱된 쿼리 페이지

우리는 DynamoDB를 위한 Pythonic ORM인 PynamoDB를 사용하며, 이는 다음을 제공합니다:

  • 모델 정의: 데이터베이스 테이블을 위한 Python 클래스

Valkey - 인메모리 캐시

Valkey (Redis의 포크)는 우리의 인메모리 캐시 계층으로 다음을 제공합니다:

  • 세션 저장소: 30일 슬라이딩 만료 기간의 사용자 세션

  • 자주 액세스하는 데이터: 제품 수, 인기 쿼리

  • 자동 완성 캐시: 검색 제안

  • 이미지 매니페스트: 제품 이미지 위치

Valkey는 상당한 성능 이점을 제공합니다:

  • 읽기 작업에서 DynamoDB보다 100배 빠름

  • 데이터베이스 부하 감소: 캐시 히트로 인한 DynamoDB 쿼리 회피

  • 세션 지속성: 요청 간 Valkey 지원 세션

우리는 Valkey를 다음 용도로 사용합니다:

  • 세션: 사용자 로그인 상태, 장바구니 데이터

  • 캐싱: 인기 쿼리, 자동 완성 제안

  • 카운터: 제품 재고 수 (성능을 위해 캐시됨)

  • : 백그라운드 작업 처리

S3 - 객체 저장소

Amazon S3는 우리의 객체 저장소 서비스입니다.

우리는 S3를 다음 용도로 사용합니다:

  • 제품 이미지: 고해상도 제품 사진

  • 데이터시트: PDF 제품 사양서

  • 정적 자산: CSS, JS, 이미지

DNS 및 라우팅

Route53 - 도메인 관리

Route53은 우리의 DNS 관리를 처리합니다:

  • 도메인 등록: thinvent.in 및 관련 도메인

Nginx 라우팅

Nginx는 URL 패턴에 따라 요청을 라우팅합니다:

  • / → Flask 앱 (홈, 제품, 장바구니, 결제)

  • /q/ → Flask 앱 (쿼리 페이지, 검색 결과)

  • /api/ → Flask 앱 (API 엔드포인트)

  • /static/ → CloudFront/S3 (정적 자산)

검색 및 AI 인프라

검색 서비스

검색 기능을 위해 독립 실행형 Flask 애플리케이션을 운영합니다. 이 서비스는 다음을 제공합니다:

  • 벡터 검색: 관련 쿼리에 대한 의미적 유사성

  • 자동 완성: 접두사 기반 검색 제안

  • 인기 쿼리: 가장 많이 검색된 용어

  • 필터 추출: 패싯을 위한 검색 쿼리 파싱

검색 서비스는 다음을 사용합니다:

  • Valkey RediSearch: 벡터 유사성 검색

  • SentenceTransformer: 임베딩 생성

  • 구문 매핑: 부분 문자열 매칭을 통한 필터 추출

AI 제공자

다양한 작업에 여러 AI 제공자를 사용합니다:

DeepSeek

  • 모델: deepseek-chat

  • 사용 사례: 제품 설명, 쿼리 페이지 콘텐츠, 번역

  • API: Together.ai 폴백이 있는 DeepSeek API

  • 캐싱: 프롬프트 캐싱 효율성을 위한 시스템 프롬프트

Gemini

  • 모델: Gemini (특정 모델)

  • 사용 사례: 콘텐츠 생성

  • 통합: 직접 API 호출

Amazon Bedrock

  • 모델: Nova Pro

  • 사용 사례: 내부 채팅

  • 통합: boto3 SDK

Amazon Bedrock

  • 모델: Nova Lite

  • 사용 사례: 고객 챗봇

  • 통합: boto3 SDK

완전한 요청 흐름

일반적인 요청이 우리의 인프라를 통해 어떻게 흐르는지 설명합니다:

flowchart TD
    A[클라이언트 브라우저] -->|DNS 쿼리| B[Route53]
    B -->|IP 주소| C[CloudFront]
    C -->|캐시 확인| D{캐시 히트?}
    D -->|예| E[캐시된 콘텐츠 반환]
    D -->|아니오| F[Nginx]
    F -->|프록시| G[Gunicorn]
    G -->|WSGI| H[Flask 앱]
    H -->|캐시 확인| I[Valkey]
    I -->|히트| J[캐시된 데이터 반환]
    I -->|미스| K[DynamoDB]
    K -->|쿼리| L[데이터 반환]
    L --> I
    J --> M[응답 구성]
    E --> M
    M --> N[클라이언트로 전송]

모니터링 및 상태 확인

UptimeRobot - 외부 모니터링

모든 공개 엔드포인트의 외부 모니터링을 위해 UptimeRobot을 사용합니다:

  • 백엔드 서버: 백엔드 웹사이트

  • www.thinvent.in: 공개 웹사이트

상태 확인

  • Gunicorn: systemd가 재시작 관리

  • Flask: /health 엔드포인트가 상태 반환

  • Valkey: 연결 상태 모니터링

  • DynamoDB: 지연 시간 및 처리량 모니터링

로깅

  • 애플리케이션 로그: Gunicorn error.log

  • 액세스 로그: Gunicorn access.log

  • 이메일: Python 트레이스백이 포함된 중요 이벤트에 대한 실시간 알림

요약

우리의 인프라는 다음을 위해 설계되었습니다:

  • 성능: 다중 캐싱 계층, CDN, 최적화된 쿼리

  • 확장성: 자동 확장 데이터베이스, 로드 밸런싱

  • 비용 효율성: 사용량 기반 과금, 데이터베이스 부하 감소를 위한 캐싱

Flask, Gunicorn, Nginx, Ubuntu, DynamoDB, Valkey, CloudFront 및 UptimeRobot의 조합은 우리의 전자상거래 플랫폼을 위한 강력하고 확장 가능한 기반을 제공합니다.

관련 문서