728x90
반응형
728x90
반응형
728x90
반응형

레이트 리미팅(Rate Limiting)과 캐싱(Caching) 전략

애플리케이션의 성능을 높이고 서버 자원을 효율적으로 관리하기 위해서는 레이트 리미팅(Rate Limiting)캐싱(Caching) 전략을 적절히 사용하는 것이 중요합니다. 특히 대규모 사용자 기반을 가진 애플리케이션에서는 서버 과부하를 방지하고 빠른 응답 속도를 유지하는 데 필수적입니다. 아래에서는 각 전략의 원리와 함께 구체적인 예제 코드를 살펴보겠습니다.

레이트 리미팅(Rate Limiting)

레이트 리미팅은 API 호출이나 데이터베이스 쿼리의 빈도를 제한하여 성능을 최적화하고, 자원을 절약하며, 서비스 오버로드를 방지하는 데 유용합니다. 예를 들어, 특정 IP 주소에서 1시간 동안 100번 이상 요청할 경우 접근을 차단하는 식으로 빈도 제한을 설정할 수 있습니다.

구현 전략: IP 주소 또는 사용자별로 특정 시간 안에 호출 가능한 요청 수를 설정하여 서버의 안정성을 유지합니다. Redis와 같은 메모리 기반 데이터 스토어를 사용해 호출 빈도를 기록하고, 초과 요청 시 대기나 실패 응답을 반환할 수 있습니다.

예제: Node.js + Redis를 이용한 레이트 리미팅

아래 코드는 Node.js와 Redis를 사용하여 특정 IP 주소에서 일정 시간 안에 호출 가능한 요청 수를 제한하는 방법을 보여줍니다.

const redis = require('redis');
const client = redis.createClient();

function rateLimiter(req, res, next) {
    const userIP = req.ip;
    client.incr(userIP, (err, count) => {
        if (count > 100) { // 예: 1시간 동안 100번 이상 요청 금지
            res.status(429).send("요청 제한 초과");
        } else {
            client.expire(userIP, 3600); // 1시간 동안 카운트 유지
            next();
        }
    });
}

위 코드에서 rateLimiter 함수는 클라이언트의 IP를 기반으로 요청 횟수를 Redis에 기록하며, 설정한 제한 횟수를 초과하면 429 상태 코드로 요청을 차단합니다. 이를 통해 서버의 과부하를 방지할 수 있습니다.

캐싱(Caching)

캐싱은 반복적으로 요청되는 데이터를 저장해 두고 빠르게 반환하는 방법으로, API나 데이터베이스의 호출 빈도를 줄여 성능을 크게 향상시킬 수 있습니다. 특히 오래 걸리는 데이터 처리 작업이나 고빈도 요청에서 효과적입니다.

캐싱 레이어 설정: 클라이언트, 서버, 데이터베이스 수준에서 캐싱을 적용할 수 있으며, Redis 같은 인메모리 스토리지를 통해 빈번히 요청되는 데이터를 캐시할 수 있습니다. 또한 TTL(Time-to-Live)을 설정하여 오래된 데이터를 자동으로 갱신하거나 삭제해 실시간성을 유지할 수 있습니다.

예제: Python + Flask + Redis를 이용한 캐싱

아래 코드는 Python의 Flask와 Redis를 사용하여 데이터베이스에서 가져온 데이터를 캐싱하여 빠르게 반환하는 예제입니다.

from flask import Flask, request
import redis

app = Flask(__name__)
cache = redis.StrictRedis(host='localhost', port=6379, db=0)

@app.route('/data')
def get_data():
    data_key = 'expensive_data'
    cached_data = cache.get(data_key)
    
    if cached_data:
        return cached_data
    else:
        data = retrieve_expensive_data()  # 오래 걸리는 데이터 처리 함수
        cache.setex(data_key, 3600, data) # 1시간 동안 캐싱
        return data

위 코드에서 get_data 함수는 먼저 Redis에 저장된 expensive_data 캐시를 확인하고, 캐시된 데이터가 있으면 즉시 반환합니다. 만약 없다면 retrieve_expensive_data 함수를 호출하여 데이터를 생성한 후, Redis에 1시간 동안 캐싱합니다. 이렇게 함으로써 동일한 요청에 대한 응답 시간을 대폭 줄일 수 있습니다.

결론

레이트 리미팅과 캐싱은 고급 애플리케이션에서 성능을 최적화하는 데 핵심적인 전략입니다. 레이트 리미팅은 서버의 안정성을 유지하며, 캐싱은 응답 속도를 향상시키는 데 기여합니다. 이 두 가지 전략을 결합하여 API 서버에서 캐시된 응답을 사용하되 요청이 많아질 경우 레이트 리미팅을 적용하면 서버 성능을 최적화할 수 있습니다.

728x90
반응형
728x90
반응형

Cesanta Mongoose 라이브러리를 이용한 HTTPS 서버 구축 방법

github의 cesanta/mongoose는 C 언어로 작성된 임베디드 웹 서버 라이브러리입니다. 이 라이브러리를 이용하면 독립적인 웹 서버 기능을 제공하며, 이를 통해 HTTPS 웹 서버를 손쉽게 구현할 수 있습니다. 다음은 cesanta/mongoose를 사용하여 HTTPS 서버를 설정하는 방법입니다.

1. Mongoose 설치

먼저 cesanta/mongoose 라이브러리를 다운로드하고 프로젝트에 포함합니다.

git clone https://github.com/cesanta/mongoose.git
cd mongoose/examples/http-server

2. HTTPS 설정

HTTPS 서버를 위해 자체 서명된 SSL 인증서를 생성하거나, CA에서 구매한 SSL 인증서를 설정해야 합니다. 다음은 OpenSSL을 사용하여 자체 서명된 인증서를 생성하는 방법입니다.

openssl req -new -x509 -days 365 -nodes -out server-cert.pem -keyout server-key.pem

이 명령어로 server-cert.pemserver-key.pem 파일이 생성됩니다.

3. HTTPS 서버 코드 작성

cesanta/mongoose 라이브러리를 사용하여 HTTPS 서버를 설정하는 예시입니다. server-key.pemserver-cert.pem 파일을 HTTPS 설정에 추가합니다.

#include "mongoose.h"

// HTTPS 서버 핸들러 함수
static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
  if (ev == MG_EV_HTTP_MSG) {
    struct mg_http_message *hm = (struct mg_http_message *) ev_data;
    mg_http_reply(c, 200, "Content-Type: text/plain\r\n", "Hello, HTTPS World!\n");
  }
}

int main(void) {
  struct mg_mgr mgr;
  struct mg_tls_opts tls_opts = {
    .cert = "server-cert.pem",
    .key = "server-key.pem",
  };
  
  mg_mgr_init(&mgr);  // Mongoose 매니저 초기화

  // HTTPS 리스너 생성
  mg_http_listen(&mgr, "https://0.0.0.0:443", cb, &tls_opts);

  printf("Starting HTTPS server on port 443...\n");

  for (;;) mg_mgr_poll(&mgr, 1000);  // 이벤트 루프
  mg_mgr_free(&mgr);  // Mongoose 매니저 해제
  return 0;
}

설명

  • mg_tls_opts: SSL 인증서와 키 파일을 설정합니다.
  • mg_http_listen: HTTPS 서버를 특정 주소와 포트에 바인딩합니다.
  • mg_mgr_poll: 이벤트 루프를 통해 클라이언트의 요청을 처리합니다.

이 코드를 컴파일하여 HTTPS 서버를 구동할 수 있습니다. mongoose는 경량 웹 서버이기 때문에 이 코드로 독립적인 HTTPS 서버를 구축할 수 있습니다.

728x90
반응형

'Web Server' 카테고리의 다른 글

레이트 리미팅(Rate Limiting)과 캐싱(Caching) 전략  (0) 2024.11.06

+ Recent posts