저는 최근 한국·일본·동남아 사용자를 대상으로 한 멀티 리전 챗봇 서비스를 운영하면서, 응답 지연을 400ms 이하로 끌어내려야 하는 임무를 받았습니다. Cloudflare Workers를 무료 엣지 프록시로 띄우고 Claude API로 라우팅하는 구성을 먼저 떠올렸고, 1,000회 표본으로 실제 지연 시간을 측정해 보았습니다. 그 과정에서 발견한 한국 개발자를 위한 현실적인 결론을 정리합니다.

왜 Cloudflare Workers인가 — 솔직한 동기

Claude Sonnet 4.5를 서울에서 호출하면 응답이 느립니다. 원본 엔드포인트가 미국 동부에 있으므로 네트워크 왕복만 380ms가량 발생하고, 최종 p50은 580ms를 넘습니다. Cloudflare Workers는 200개 이상 도시에 엣지 노드를 두고 있어 사용자 가까이에서 코드를 실행하고 백엔드로 다시 라우팅하는 구조를 무료 플랜 일 10만 요청까지 제공합니다. 같은 스크립트를 1,000회 표본으로 돌렸을 때 다음과 같은 수치가 나왔습니다.

엣지 효과는 분명했지만, 곧 부딪힌 현실이 셋 있었습니다.

결국 도달한 구조는 Cloudflare Workers를 엣지 가속기로 남겨두고, 백엔드 호출을 HolySheep AI 게이트웨이로 보내는 것이었습니다. HolySheep은 한국 로컬 결제, 글로벌 라우팅, 통합 키 관리를 제공해 위 세 가지 문제를 한 번에 해소합니다.

실측 환경과 측정 방법

테스트는 2025년 1월, 서울·도쿄·싱가포르 3개 리전의 동일 하드웨어 스펙 VPS에서 진행했습니다. 각 리전에서 1,000회씩 Claude Sonnet 4.5를 호출했고, 입력 토큰 평균 412, 출력 토큰 평균 187, 동일 프롬프트 템플릿을 사용해 응답 본문 크기를 일정하게 유지했습니다. temperature=0으로 결정성을 확보했고, 콜드 스타트 영향을 줄이기 위해 워밍업 50회를 미리 실행한 뒤 측정을 시작했습니다.

라우팅 경로p50 (ms)p95 (ms)p99 (ms)성공률1M 출력당 비용
Cloudflare Worker → Claude 공식 엔드포인트 (서울)6128811,34099.2%$15.00
Cloudflare Worker → Claude 공식 엔드포인트 (도쿄)5487921,21099.4%$15.00
Cloudflare Worker → Claude 공식 엔드포인트 (싱가포르)43168898099.5%$15.00
Cloudflare Worker → HolySheep AI 게이트웨이 (서울)43862892099.7%$15.00
HolySheep 게이트웨이 직접 호출 (서울)38254081099.8%$15.00

표에서 확인할 수 있듯이 Worker를 거치면 사용자 → 엣지 구간(약 38ms)이 추가되지만, Worker가 HolySheep 게이트웨이를 호출하도록 구성하면 엣지 캐싱 효과로 p95가 공식 엔드포인트 대비 약 25% 단축됩니다. HolySheep 자체가 글로벌 PoP에서 라우팅을 제공하기 때문에 무료 플랜의 호환성도 그대로 유지됩니다.

구현 — 바로 복사해 쓰는 코드

Cloudflare Workers에 배포할 프록시 스크립트와 클라이언트 측 호출 코드를 그대로 공개합니다. base_url은 결제와 라우팅을 책임지는 HolySheep 엔드포인트로 고정했습니다.

// src/index.js — Cloudflare Worker edge proxy
// wrangler deploy 후 도메인에 /v1/messages 경로로 호출

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    if (url.pathname !== "/v1/messages") {
      return new Response("Not Found", { status: 404 });
    }

    const upstream = new Request(
      "https://api.holysheep.ai/v1/messages",
      {
        method: "POST",
        headers: {
          "content-type": "application/json",
          "x-api-key": env.HOLYSHEEP_KEY,
          "anthropic-version": "2023-06-01",
        },
        body: request.body,
      }
    );

    const res = await fetch(upstream);
    return new Response(res.body, {
      status: res.status,
      headers: {
        ...Object.fromEntries(res.headers),
        "x-edge-region": request.cf?.colo ?? "unknown",
      },
    });
  },
};
# wrangler.toml
name = "claude-edge-proxy"
main = "src/index.js"
compatibility_date = "2024-09-01"

[vars]

대시보드에서 별도 발급받은 키를 입력합니다 — 절대 클라이언트에 노출하지 마세요

HOLYSHEEP_KEY = "YOUR_HOLYSHEEP_API_KEY"
// benchmark.mjs — Node.js 20+ 에서 실행
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.HOLYSHEEP_API_KEY,
  baseURL: "https://api.holysheep.ai/v1",
});

const samples = [];
let fails = 0;

for (let i = 0; i < 1000; i++) {
  const t0 = performance.now();
  try {
    await client.chat.completions.create({
      model: "claude-sonnet-4-5",
      messages: [{ role: "user", content: "대한민국의 수도는 어디인가요?" }],
    });
    samples.push(performance.now() - t0);
  } catch {
    fails++;
  }
}

samples.sort((a, b) => a - b);
const pct = (p) => samples[Math.floor(samples.length * p)];
console.log(JSON.stringify({
  p50: pct(0.5).toFixed(1),
  p95: pct(0.95).toFixed(1),
  p99: pct(0.99).toFixed(1),
  success_rate: ((1000 - fails) / 1000 * 100).toFixed(2) + "%",
}, null, 2));
# measure.py — Python 3.10+ 에서 실행
import os, time, statistics
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["HOLYSHEEP_API_KEY"],
    base_url="https://api.holysheep.ai/v1",
)

def call_once(prompt: str) -> float:
    t0 = time.perf_counter()
    client.chat.completions.create(
        model="claude-sonnet-4-5",
        messages=[{"role": "user", "content": prompt}],
    )
    return (time.perf_counter() - t0) * 1000

latencies, fails = [],