전체 스택을 더 쉽게 만들기
이번 만우절을 맞아 Cloudflare도 여러분과 마찬가지로 즐거운 시간을 보내고 싶지만, 중대한 발표를 하게 되었습니다. 사실, 지금 현재 Cloudflare 플랫폼을 기반으로 구축하고 있는 개발자는 2백만 명이 넘습니다. 이건 농담이 아닙니다!
이번 Developer Week 시작과 함께 Cloudflare에서는 세 가지 제품을 출시할 준비가 되었음을 알리는 ‘배포 준비 완료’ 스위치를 켭니다. Cloudflare의 서버리스 SQL 데이터베이스인 D1, 기존 데이터베이스를 분산형 데이터베이스로(그리고 더 빠르게!) 만들어 주는 Hyperdrive, 당사의 시계열 데이터베이스인 Workers Analytics Engine 등이 그것입니다.
저희는 한동안 개발자들이 전체 스택을 Cloudflare로 가져올 수 있도록 열심히 노력해 왔는데, Cloudflare에서 구축된 앱은 어떤 모습일까요?
다이어그램 자체는 익숙한 도구와 크게 다르지 않아야 합니다. 핵심 사용자 데이터를 위한 데이터베이스와 자산 및 사용자 콘텐츠를 위한 개체 스토리지가 필요합니다. 또한 이메일이나 업로드 처리와 같은 백그라운드 작업을 위한 대기열과 런타임 구성을 위한 빠른 키-값 저장소가 필요할 수도 있습니다. 사용자 이벤트 및/또는 성능 데이터를 집계하기 위해 시계열 데이터베이스가 필요할 수도 있습니다. 이는 검색, 추천, 이미지 분석 등의 작업에서 앱의 필수 요소로 자리 잡고 있는 AI에 대해 이야기하기 전에 시작에 불과합니다(최소한 말입니다!).
하지만 이 아키텍처는 지구라는 규모로 실행되기 때문에 확장 가능성과 안정성, 빠른 속도를 모두 보장할 수밖에 없습니다. 또한 즉시 사용 가능해야 하고요.
D1 일반 사용자 이용 가능: 배포 준비 완료
핵심 데이터베이스는 인프라에서 가장 중요한 부분 중 하나입니다. 매우 안정적이어야 합니다. 데이터 손실이 없어야 합니다. 확장성 또한 뛰어나야 합니다. 이는 바로 Cloudflare가 지난 1년 동안 D1의 배포를 준비해 온 이유입니다. 이제 일반 사용자가 Cloudflare의 글로벌 서버리스 SQL 데이터베이스인 D1을 사용할 수 있게 되었음을 발표하게 되어 기쁘게 생각합니다.
일반 사용자가 이용 가능한 D1에는 다음과 같이 가장 요청이 많았던 기능이 포함되어 있습니다.
10GB 데이터베이스 및 계정당 50,000개의 데이터베이스 지원
새로운 데이터 내보내기 기능
향상된 쿼리 디버깅(Cloudflare에서는 'D1 인사이트'라고 함)은 어떤 쿼리가 가장 많은 시간과 비용을 필요로 하거나 비효율적인지 식별할 수 있는 기능으로...
...개발자가 D1으로 배포 준비 완료된 앱을 구축하여 모든 관계형 SQL 요구 사항을 충족할 수 있도록 지원합니다. 그리고 중요한 것은 ‘free plan’ 또는 ‘hobby plan’ 같은 무료 요금제라는 개념이 위험에 처해 있는 이 시대에, Cloudflare에서는 D1의 무료 티어를 없애거나 월 $5의 Workers 유료 요금제에 포함된 _250억 행 읽기_를 줄일 생각이 전혀 없다는 점을 분명히 말씀드립니다.
요금제
읽은 행
쓴 행
스토리지
export default {
async fetch(request: Request, env: Env) {
const {pathname} = new URL(request.url);
let resp = null;
let session = env.DB.withSession(token); // An optional commit token or mode
// Handle requests within the session.
if (pathname === "/api/orders/list") {
// This statement is a read query, so it will work against any
// replica that has a commit equal or later than `token`.
const { results } = await session.prepare("SELECT * FROM Orders");
resp = Response.json(results);
} else if (pathname === "/api/orders/add") {
order = await request.json();
// This statement is a write query, so D1 will send the query to
// the primary, which always has the latest commit token.
await session.prepare("INSERT INTO Orders VALUES (?, ?, ?)")
.bind(order.orderName, order.customer, order.value);
.run();
// In order for the application to be correct, this SELECT
// statement must see the results of the INSERT statement above.
//
// D1's new Session API keeps track of commit tokens for queries
// within the session and will ensure that we won't execute this
// query until whatever replica we're using has seen the results
// of the INSERT.
const { results } = await session.prepare("SELECT COUNT(*) FROM Orders")
.run();
resp = Response.json(results);
}
// Set the token so we can continue the session in another request.
resp.headers.set("x-d1-token", session.latestCommitToken);
return resp;
}
}
Workers Paid
매월 첫 250억 개 포함
+ 이후 100만 행당 $0.001
매월 첫 5천만 개 포함
이후 100만 행당 $1.00
첫 달 5GB 포함
// Use the popular 'pg' driver? Easy. Hyperdrive just exposes a connection string
// to your Worker.
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
await client.connect();
// Prefer using an ORM like Drizzle? Use it with Hyperdrive too.
// https://orm.drizzle.team/docs/get-started-postgresql#node-postgres
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
await client.connect();
const db = drizzle(client);
+ 이후 매월 GB당 $0.75
Workers Free
500만 / 일
100,000 / 일
5GB(총)
말씀드립니다.처음부터 D1을 팔로우해 주신 분들을 위해 오픈 베타에서 발표한 가격과 동일하게 유지합니다
하지만 GA로 끝나는 것이 아닙니다. 글로벌 읽기 복제, 더 큰 규모의 데이터베이스, 데이터베이스를 분기할 수 있는 더 많은 시간 이동(Time Travel) 기능, Worker 내에서 즉각적인 동적 쿼리, 새 데이터베이스 생성이 가능한 새로운 API 등 D1에서는 몇 가지 주요 새 기능이 준비되어 있습니다.
// Pull and acknowledge messages from a Queue using any HTTP client
$ curl "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/queues/${QUEUE_ID}/messages/pull" -X POST --data '{"visibilityTimeout":10000,"batchSize":100}}' \
-H "Authorization: Bearer ${QUEUES_TOKEN}" \
-H "Content-Type:application/json"
// Ack the messages you processed successfully; mark others to be retried.
$ curl "https://api.cloudflare.com/client/v4/accounts/${CF_ACCOUNT_ID}/queues/${QUEUE_ID}/messages/ack" -X POST --data '{"acks":["lease-id-1", "lease-id-2"],"retries":["lease-id-100"]}' \
-H "Authorization: Bearer ${QUEUES_TOKEN}" \
-H "Content-Type:application/json"
D1의 읽기 복제는 필요에 따라 읽기 복제본을 자동으로 배포하여 사용자에게 데이터를 더 가까운 곳에서 제공하고, 사용자가 스핀업, 확장 관리, 일관성(복제 지연) 문제를 겪을 필요가 없도록 지원합니다. 다음으로는 곧 출시될 D1의 복제 API 기능을 미리 소개합니다.
가장 중요한 측면은 개발자에게 세션 기반 일관성을 유지할 수 있는 기능을 제공하여 사용자가 복제로 인한 성능 및 대기 시간 개선의 이점을 누릴 수 있도록 하는 동시에 변경 사항이 지속적으로 반영되도록 하는 것입니다.
// Apply a delay to a message when sending it
await env.YOUR_QUEUE.send(msg, { delaySeconds: 3600 })
// Delay a message (or a batch of messages) when marking it for retry
for (const msg of batch.messages) {
msg.retry({delaySeconds: 300})
}
D1의 읽기 복제가 어떻게 작동하는지 자세히 알아보려면 Cloudflare의 심층 분석 게시물을 참조하고, D1을 기반으로 지금 바로 구축을 시작할 준비가 되었다면 개발자 문서로 이동하여 첫 번째 데이터베이스를 생성해 보세요.
Hyperdrive: GA
Cloudflare에서는 지난 9월, 창립기념일 주간에 Hyperdrive를 오픈 베타 버전으로 출시했습니다. 이제 실전 테스트를 거쳐 일반 사용자를 대상으로 배포할 준비가 되었다는 의미입니다.
Hyperdrive가 생소한 분들을 위해 설명하겠습니다. 이미 보유한 중앙 집중식 데이터베이스를 글로벌 방식으로 사용할 수 있도록 설계되었습니다. Cloudflare의 전역 네트워크를 활용하여 데이터베이스에 더 빠른 경로를 제공하고, 커넥션 풀을 항상 준비 상태로 유지하며, 가능한 한 사용자와 가까운 곳에서 가장 자주 실행되는 쿼리를 캐시합니다.
중요한 점은 Hyperdrive에서 기본적으로 가장 일반적으로 사용되는 드라이버와 ORM(개체-관계 매퍼) 라이브러리를 지원하므로 쿼리를 다시 학습하거나 다시 작성할 필요가 없다는 것입니다.
하지만 이제 "GA"가 되었다고 해서 Hyperdrive에 대한 작업을 중단하는 것은 아닙니다. 앞으로 몇 달에 걸쳐 가장 널리 배포된 다른 데이터베이스 엔진인 MySQL을 지원할 예정입니다. 또한 Cloudflare Tunnel 및 Magic WAN을 통해 사설 네트워크(클라우드 VPC 네트워크 포함) 내부의 데이터베이스에 연결하는 기능도 지원할 예정입니다. 아울러 무효화 및 캐싱 전략에 대해 더 많은 구성 기능을 제공하여 성능과 데이터 최신성에 대해 보다 세밀하게 결정할 수 있도록 할 계획입니다.
저희는 Hyperdrive의 가격을 어떻게 결정할지 고민한 결과, 비용을 청구하는 것은 옳지 않다는 것을 깨달았습니다. 궁극적으로 Hyperdrive의 성능상의 이점은 기존 데이터베이스 엔진에 연결할 때 중요하고 필수적입니다. 사용자가 Hyperdrive 없이 데이터베이스 연결 및 쿼리를 요청할 때마다 왕복 6회 이상의 대기 시간 오버헤드를 지불하는 것은 불공평하다고 생각했습니다.
이제 Workers 유료 요금제를 사용하는 모든 개발자에게 Hyperdrive를 무료로 제공한다는 소식을 알려드리게 되어 기쁘게 생각합니다. 여기에는 쿼리 캐싱, 커넥션 풀링뿐만 아니라 서로 다른 앱, 배포 및 준비 단계를 분리하거나 서로 다른 구성(예: 캐시된 것과 캐시되지 않은 것)을
요금제
쿼리당 가격
커넥션 풀링
Workers Paid
$0
$0
Hyperdrive를 시작하려면 문서로 이동하여 기존 데이터베이스를 연결하고 Workers에서 쿼리를 시작하는 방법을 알아보세요.
Queues: 어디에서든 가져오기 사용
최신의 전체 스택 앱을 구축하는 데 작업 대기열은 점점 더 중요해지고 있으며, 이는 Cloudflare에서 Queues의 오픈 베타를 처음 발표한 시점에 고려한 사항입니다. 그 이후로 Cloudflare에서는 몇 가지 주요 Queues 기능을 개발했으며, 이번 주에는 pull-based consumer와 새로운 메시지 전달 제어라는 두 가지 기능을 출시합니다.
이제 HTTP를 사용하는 모든 클라이언트는 대기열에서 다음 메시지를 가져올 수 있습니다. 대기열의 새로운 /pull 엔드포인트를 호출하여 메시지 배치를 요청할 수 있으며, /ack 엔드포인트를 호출하여 각 메시지(또는 메시지 배치)를 성공적으로 처리하면 다음 내용을 승인할 수 있습니다.
Pull-based consumer는 어디에서든 실행할 수 있으므로 기존 레거시 클라우드 인프라와 함께 queue consumers를 실행할 수 있습니다. Cloudflare 내 팀들은 310여 곳의 데이터 센터에서 대기열에 장치 원격 분석을 기록하고 Kubernetes에서 실행되는 내부 인프라 일부에서 소비하는 데 중점을 두는 사용 사례를 통해 초기에 이 기능을 도입했습니다. 핵심은 전 세계적으로 분산된 대기열 인프라를 사용하여 고객이 메시지를 처리할 준비가 될 때까지 대기열에 메시지를 보관한다는 점입니다.
이제 Queues는 메시지를 대기열로 보낼 때와 재시도를 위해 메시지를 표시할 때 모두 메시지를 지연시킬 수 있습니다. 이 기능은 향후 작업을 큐에 넣을 때(농담입니다)뿐만 아니라 업스트림 API 또는 인프라에 속도 제한으로 인해 메시지 처리 속도를 제어해야 하는 경우 백오프 메커니즘을 적용하는 데에도 도움이 될 수 있습니다.
또한 앞으로 몇 달 안에 일반 사용자가 Queues를 이용할 수 있도록 전환하는 과정에서 대기열당 처리량을 대폭 늘릴 계획입니다. Cloudflare에서는 Queues의 안정성이 매우 중요하다는 것을 잘 알고 있습니다. 메시지가 손실되거나 삭제되면 사용자가 주문 확인 이메일, 비밀번호 재설정 알림을 받지 못하거나 업로드가 처리되지 않을 수 있습니다. 이러한 문제는 사용자에게 직접적인 영향을 미치며 복구하기도 어렵습니다.
Workers Analytics Engine,
Workers Analytics Engine은 Workers의 데이터 포인트를 작성하는 기본 제공 API와 해당 데이터 쿼리를 위한 SQL API를 통해 대규모로 무제한의 카디널리티 분석을 제공합니다.
Workers Analytics Engine은 Cloudflare에서 여러 해 동안 사용해 온 동일한 ClickHouse 기반 시스템에서 지원됩니다. 당사에서는 이 시스템을 직접 활용하여 Cloudflare의 서비스 성능을 관찰하고, 요금 청구 목적으로 제품 사용 데이터를 캡처하며, 특정 고객의 사용 패턴에 대한 질문에 답변합니다. 이 시스템에는 Cloudflare의 네트워크에 대한 거의 모든 요청에 대해 최소한 하나 이상의 데이터 포인트가 기록됩니다. Workers Analytics Engine을 사용하면 귀사에서는 동일한 인프라를 사용하여 자체 맞춤형 분석을 구축할 수 있으며, 복잡한 측면은 Cloudflare에서 대신 관리합니다.
베타 출시 이후, 개발자들은 대기업부터 Counterscale과 같은 오픈 소스 프로젝트에 이르기까지 동일하거나 다양한 용도로 Workers Analytics Engine을 사용하게 되었습니다. 몇 년 동안 Workers Analytics Engine은 중요 업무용 워크로드와 함께 대규모로 운영되어 왔지만, 가격 관련 정보는 아직까지 공개되지 않았습니다.
Workers Analytics Engine의 가격 구조는 두 가지 메트릭을 기준으로 단순하게 책정됩니다.
데이터 포인트 작성 — Worker에서 writeDataPoint()가 호출될 때마다 하나의 데이터 포인트가 작성된 것으로 간주됩니다. 다른 플랫폼과 달리 각 데이터 포인트의 비용은 동일합니다. 또한 차원이나 카디널리티 추가에 관계없이 페널티가 없고, 압축된 데이터 포인트의 크기나 비용을 예측할 필요가 없습니다.
쿼리 읽기 — Workers Analytics Engine SQL APII에 게시할 때마다 하나의 읽기 쿼리로 계산됩니다. 다른 플랫폼과 달리 모든 쿼리는 비용이 동일하며 쿼리 복잡성과 관계없이 페널티가 없습니다. 또한 각 쿼리에서 읽은 데이터 행의 수를 추론할 필요가 없습니다.
Workers Free 요금제와 Workers 유료 요금제 모두 데이터 포인트를 작성하고 읽을 수 있는 쿼리가 할당되며, 추가 사용량에 대한 요금은 다음과 같습니다.
요금제
데이터 포인트 작성
쿼리 읽기
Workers Paid
월 1천만 개 포함
+이후 백만당 $0.25
월 1백만 개 포함
+이후 백만당 $1.00
Workers Free
하루 100,000개 포함
하루 10,000개 포함 per day
이 요금제를 사용하면 Worker에서 함수를 호출한 횟수와 HTTP API 엔드포인트에 요청을 보낸 횟수를 계산하여 “Workers Analytics Engine의 비용은 얼마인가요?”라는 질문에 대한 답을 얻을 수 있습니다. 복잡한 계산 없이도 빠르고 간단하게 추정해 보세요.
이 요금제는 앞으로 몇 달 내에 모든 사용자가 이용할 수 있게 됩니다. 그 전까지는 Workers Analytics Engine을 계속 무료로 사용할 수 있습니다. Worker에서 지금 바로 데이터 포인트를 작성하고 단 몇 분, 10줄 미만의 코드만으로 데이터 캡처를 시작할 수 있습니다. 여러분의 의견을 기다리겠습니다.
새로운 한 주가 시작되었습니다
내일 Developer Week 두 번째 날을 맞이하여 어떤 소식이 준비되어 있을지 기대해 주세요. 질문이 있거나 이미 만든 멋진 창작물을 소개하고 싶으시다면 개발자 Discord에 참여해 주세요.