Workers AI 장애 시 OpenAI로 자동 전환하기: Cloudflare AI Gateway 폴백 체인과 정확 일치 캐싱
프로덕션에서 LLM 호출이 서비스 크리티컬 패스에 들어와 있는 팀이라면, 공급자 하나에 묶이는 게 얼마나 불편한지 이미 알고 있을 겁니다. OpenAI의 429(rate limit), Anthropic의 5xx, 특정 리전만 문제가 생기는 상황 — 이런 이벤트는 각 공급자의 상태 페이지(status.openai.com, status.anthropic.com)에서 주기적으로 확인되고, 멀티스텝 에이전트 워크플로처럼 한 요청 안에서 LLM 호출이 여러 번 일어나는 구조라면 체감 확률이 더 올라갑니다.
Cloudflare AI Gateway는 이 문제를 애플리케이션 코드 밖 — 인프라 레이어에서 해결하는 관리형 프록시입니다. 여러 공급자를 폴백 체인으로 묶고, 반복되는 요청은 엣지 캐시에서 응답합니다. 다만 자주 오해받는 지점이 있는데, 이 글에서 다루는 캐싱은 정확 일치(Exact-Match) 방식이지 시맨틱 캐싱이 아닙니다. 시맨틱 캐싱은 아직 지원되지 않으므로, 그 부분은 대안 도구와 조건을 함께 정리합니다.
이 글에서는 (1) Universal Endpoint로 폴백 체인을 구성하는 방법, (2) 정확 일치 캐싱이 실제로 효과 있는 워크로드, (3) 도입 전 알아둘 트레이드오프와 판단 기준을 다룹니다.
AI Gateway가 중간에 끼는 이유
일반적인 LLM 연동 코드는 공급자 SDK를 직접 호출합니다. OpenAI SDK와 Anthropic SDK를 각각 초기화하고, 오류 처리와 재시도 로직도 공급자별로 다르게 작성하게 됩니다. 공급자를 하나 추가하려면 코드 수정이 필요하고, 요청/응답 로깅을 붙이려면 미들웨어를 따로 짜야 합니다.
AI Gateway는 이 레이어를 중앙화합니다. 애플리케이션은 Universal Endpoint 하나만 바라보고, 라우팅·폴백·캐싱·로깅은 Gateway 안에서 처리됩니다.
2026년 8월 통합의 의미
2026년 8월 7일자 Cloudflare Changelog에 따르면, Workers AI(관리형 GPU 추론)와 AI Gateway가 단일 컨트롤 플레인으로 통합됐습니다. env.AI.run() 바인딩 하나로 Cloudflare 호스팅 오픈소스 모델과 OpenAI·Anthropic 같은 외부 공급자 모델을 동일하게 호출할 수 있고, 관측성·로깅·캐싱이 같은 경로에서 처리됩니다. AI Gateway 크레딧으로 Workers AI 추론 비용을 통합 결제할 수 있게 된 것도 이 릴리스의 변경점입니다. 프론티어 모델 요청 한도 상향도 같이 발표됐는데, 정확한 수치와 적용 범위는 해당 Changelog에서 자신의 플랜에 해당하는 조건을 확인하는 편이 안전합니다.
폴백 체인 설계
Universal Endpoint 요청 구조
폴백 체인은 Universal Endpoint에 providers 배열로 공급자를 나열해 구성합니다. AI Gateway는 배열 순서대로 시도하고, 업스트림 오류나 타임아웃이 나면 다음 공급자로 넘어갑니다.
주의할 점은 endpoint 필드입니다. 이 필드는 모델 이름이 아니라 공급자의 API 경로입니다. OpenAI라면 chat/completions, Anthropic이라면 v1/messages가 들어가야 하고, 실제 모델 지정은 query 객체 안 model 필드에서 이뤄집니다. Workers AI만 예외적으로 모델 경로(@cf/meta/llama-3-8b-instruct)가 곧 엔드포인트 역할을 합니다.
{
"providers": [
{
"provider": "workers-ai",
"endpoint": "@cf/meta/llama-3-8b-instruct",
"headers": { "Authorization": "Bearer {cf_token}" },
"query": {
"messages": [{ "role": "user", "content": "안녕하세요" }]
}
},
{
"provider": "openai",
"endpoint": "chat/completions",
"headers": { "Authorization": "Bearer {openai_key}" },
"query": {
"model": "gpt-4o-mini",
"messages": [{ "role": "user", "content": "안녕하세요" }]
}
},
{
"provider": "anthropic",
"endpoint": "v1/messages",
"headers": {
"x-api-key": "{anthropic_key}",
"anthropic-version": "2023-06-01"
},
"query": {
"model": "claude-3-haiku-20240307",
"max_tokens": 1024,
"messages": [{ "role": "user", "content": "안녕하세요" }]
}
}
]
}Cloudflare Workers에서의 호출 코드는 이렇습니다.
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { prompt } = await request.json<{ prompt: string }>();
const gatewayUrl =
`https://gateway.ai.cloudflare.com/v1/${env.CF_ACCOUNT_ID}/${env.CF_GATEWAY_ID}/`;
const response = await fetch(gatewayUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'cf-aig-cache-ttl': '3600',
},
body: JSON.stringify({
providers: [
{
provider: 'workers-ai',
endpoint: '@cf/meta/llama-3-8b-instruct',
headers: { Authorization: `Bearer ${env.CF_TOKEN}` },
query: { messages: [{ role: 'user', content: prompt }] },
},
{
provider: 'openai',
endpoint: 'chat/completions',
headers: { Authorization: `Bearer ${env.OPENAI_API_KEY}` },
query: {
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: prompt }],
},
},
{
provider: 'anthropic',
endpoint: 'v1/messages',
headers: {
'x-api-key': env.ANTHROPIC_API_KEY,
'anthropic-version': '2023-06-01',
},
query: {
model: 'claude-3-haiku-20240307',
max_tokens: 1024,
messages: [{ role: 'user', content: prompt }],
},
},
],
}),
});
const step = response.headers.get('cf-aig-step');
console.log(`Provider step: ${step ?? '0'}`);
return response;
},
};폴백이 트리거되는 조건
폴백은 공급자가 오류를 반환하거나 설정한 타임아웃을 초과할 때 다음 단계로 이동합니다. 재시도 횟수와 백오프(constant, linear, exponential) 방식은 Gateway 설정에서 조정합니다.
응답 헤더 cf-aig-step은 0-indexed로, 값이 1이면 첫 번째 공급자가 실패하고 두 번째가 응답했다는 뜻입니다. 이 헤더를 로그에 남기고 대시보드에 지표로 올려두면 어떤 공급자에서 얼마나 자주 폴백이 발생하는지 추적할 수 있습니다.
정확 일치 캐싱으로 반복 요청 비용 줄이기
실제로 효과 있는 워크로드
AI Gateway의 현재 캐싱은 정확 일치(Exact-Match) 기반입니다. 요청 본문이 바이트 단위로 완전히 동일해야 캐시를 반환하고, 프롬프트 표현이 조금이라도 다르면 미스가 납니다.
이 방식이 실질적으로 효과를 내는 조건은 명확합니다 — 요청 본문의 다양성이 좁게 수렴하는 경우입니다.
- FAQ 봇 중에서도 UI가 사전 정의된 질문 버튼으로만 진입하는 경우 (자유 입력 상자는 히트율이 낮음)
- 감성 분석·언어 감지처럼 입력 문서 집합이 반복되고 프롬프트 템플릿이 고정된 배치성 작업
- 같은 문서를 다시 요약하거나 같은 코드 스니펫을 설명하는 요청이 반복되는 개발자 도구 백엔드
반대로 시스템 프롬프트만 고정하고 사용자 입력이 자유 텍스트인 대화형 워크로드에서는 요청 본문이 매번 달라지므로 정확 일치 캐시로는 유의미한 히트를 얻기 어렵습니다.
Antigravity Lab의 사례 리포트는 FAQ 성격의 워크로드에서 캐싱 도입 후 LLM 비용을 크게 절감했다고 보고합니다. 다만 이 수치는 특정 워크로드 조건에서의 결과이므로, 자기 트래픽의 요청 본문 중복도를 먼저 측정한 뒤 기대치를 잡는 게 안전합니다.
캐싱은 요청 헤더 수준에서 제어합니다.
const response = await fetch(gatewayUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'cf-aig-cache-ttl': '86400', // 24시간
'cf-aig-skip-cache': 'false', // true 지정 시 이 요청은 캐시 우회
},
body: JSON.stringify({ providers: [/* ... */] }),
});캐시는 Cloudflare PoP에 분산되므로 히트 시에는 원본 공급자 왕복 없이 엣지에서 즉시 응답이 반환됩니다.
시맨틱 캐싱은 현재 미지원
의미가 같은 질의를 하나의 캐시 항목으로 묶어주는 시맨틱 캐싱은 AI Gateway에서 아직 지원하지 않습니다. 대안이 필요하다면 다음 도구들을 검토할 수 있습니다.
| 도구 | 시맨틱 캐싱 | 자체 호스팅 | 특징 |
|---|---|---|---|
| LiteLLM | 지원 | 가능 | 오픈소스, Redis 등 캐시 백엔드 연동 |
| Bifrost | 지원 | 가능 | 오픈소스, 예산·거버넌스 기능 다수 |
| OpenRouter | 미지원 | 불필요 | 공급자 라우팅·비교 특화 |
| AI Gateway | 미지원 | 불필요 | 관리형, Cloudflare 생태계 통합 |
Cloudflare 스택 안에서 시맨틱 캐싱을 직접 만들고 싶다면, Vectorize에 프롬프트 임베딩을 저장하고 유사도 임계값 기반으로 캐시 키를 도출하는 레이어를 Worker에 얹는 구성이 가능합니다. AI Gateway의 폴백·관측성은 그대로 유지되지만, 임베딩 비용·정확도 튜닝·오답 리스크가 추가되므로 트래픽 규모가 그만한 투자를 정당화하는지 먼저 판단해야 합니다.
관측성과 속도 제한
AI Gateway를 붙이면 코드 변경 없이 Cloudflare 대시보드에서 다음을 확인할 수 있습니다.
- 공급자별 요청 수, 에러율, 지연 시간
- 토큰 사용량과 비용
- 요청별 프롬프트·응답 로그
cf-aig-step분포로 본 폴백 발생 단계
속도 제한도 Gateway 수준에서 설정 가능합니다. 고정(Fixed) 또는 슬라이딩(Sliding) 윈도우를 선택해 과도한 비용 발생이나 오남용을 차단합니다. 관측성·정확 일치 캐싱·속도 제한은 현재 무료 플랜에 포함되어 있습니다.
도입 전에 따져볼 트레이드오프
장점
| 항목 | 내용 |
|---|---|
| 인프라 없이 도입 | Workers/Pages 사용 팀이라면 추가 서버 없이 붙일 수 있음 |
| 핵심 기능 무료 | 관측성, 정확 일치 캐싱, 속도 제한이 무료 플랜 포함 |
| 표준화된 응답 포맷 | 공급자별 응답이 정규화되어 클라이언트 분기 로직 축소 |
| 글로벌 엣지 캐싱 | Cloudflare PoP 분산, 히트 시 지연 감소 |
| Workers AI 통합 과금 | 2026년 8월 이후 AI Gateway 크레딧으로 일원화 가능 |
제한사항
| 항목 | 내용 |
|---|---|
| 시맨틱 캐싱 미지원 | 요청 본문 다양성이 큰 워크로드에서 캐시 히트율이 낮음 |
| 커스텀 엔드포인트 | 지원 공급자 목록 밖의 자체 호스팅 모델 연동은 제약 있음 |
| 고급 라우팅 | 비용 기반 동적 라우팅·다중 모델 A/B 분기는 LiteLLM·Bifrost 대비 단순 |
| 생태계 종속 | Workers 밖에서는 HTTP 직접 호출 형태로만 사용 |
| 스트리밍 캐싱 | SSE 응답에 대한 캐싱 동작은 공식 문서 확인 필요 |
| Unified Billing | 통합 과금 사용 시 별도 수수료 조건이 붙을 수 있으므로 요금 페이지 확인 |
실무에서 자주 보이는 실수
캐시 TTL을 일률적으로 길게 잡는 경우. 실시간성이 필요한 응답(가격, 재고, 뉴스 요약)에 24시간 TTL을 그대로 걸면 오래된 답이 계속 반환됩니다. 콘텐츠 특성에 따라 엔드포인트나 캐시 키를 분리해서 관리하는 편이 안전합니다.
cf-aig-step 헤더를 로깅하지 않는 경우. 폴백이 발생했다는 사실 자체가 상위 공급자의 이상 신호입니다. 이 값의 시계열 지표에 알람을 걸어두면, 특정 공급자의 장애 조짐을 사용자 리포트보다 먼저 감지할 수 있습니다.
스트리밍과 캐싱을 같은 경로에서 다루는 경우. SSE 스트리밍 응답의 캐싱 동작(캐시 무시인지, 첫 청크만 저장인지, 별도 처리가 필요한지)은 공식 문서에서 자신이 쓰는 공급자·엔드포인트 기준으로 확인한 뒤 결정해야 합니다. 실무에서는 스트리밍 경로와 캐싱 대상 경로를 엔드포인트 수준에서 분리하는 편이 예외 상황을 줄이는 데 유리했습니다.
언제 다른 도구로 전환을 검토해야 하는가
AI Gateway는 "지금 코드에 최소 변경으로 관측성과 폴백을 얹는" 용도에서는 가성비가 매우 좋습니다. 반대로 다음 신호가 보이기 시작하면 LiteLLM·Bifrost 같은 오픈소스 게이트웨이나 자체 캐싱 레이어를 병행하는 구성을 고민해야 합니다.
- 캐시 히트율이 정체된다. 대시보드상 정확 일치 히트율이 트래픽 증가와 무관하게 낮게 머무른다면, 요청 본문의 다양성이 너무 커서 시맨틱 캐싱이 필요한 시점입니다.
- 비용 기반 라우팅이 필요해진다. 프롬프트 길이·시각·모델 가격에 따라 공급자를 동적으로 고르는 정책이 필요한데 Gateway 폴백만으로는 표현이 어렵다면, 라우팅 표현력이 큰 게이트웨이가 맞습니다.
- Cloudflare 밖 워크로드 비중이 커진다. 온프레미스 GPU나 자체 호스팅 모델이 트래픽의 상당 부분을 차지하기 시작하면, Gateway의 관리형 이점이 상쇄됩니다.
- 감사·거버넌스 요구가 늘어난다. 팀/프로젝트별 예산, 승인 워크플로, 감사 로그 보관 정책이 강해지면 엔터프라이즈 지향 게이트웨이의 세밀한 제어가 필요해집니다.
반대로 이 신호들이 보이기 전까지는, 무료 관측성과 폴백 체인만 붙여도 프로덕션에서 체감되는 안정성 개선이 나옵니다. 우선 자신의 트래픽에서 cf-aig-step 분포와 정확 일치 캐시 히트율을 2~4주 정도 측정해보고, 그 데이터를 근거로 다음 단계를 정하는 순서를 권합니다.