· cloudflare-workers / pricing / serverless
Chi phí thực tế khi chạy production trên Cloudflare Workers
Workers rẻ cho các API nặng I/O ở lượng request cao. KV writes, lỗi D1 write, và Durable Objects không dùng Hibernation API là nơi hoá đơn tăng vọt.
Bởi Ethan
3.423 từ · 18 phút đọc
Cloudflare Workers thực sự rẻ cho một số workload — và đắt bất ngờ cho những workload khác. Tiêu đề là $5/tháng cho 10 triệu request. Hoá đơn thực tế của một side project nặng KV write có thể lên đến $158/tháng. Một bug D1 từng khiến một ứng dụng production nhận hoá đơn $4,868 chỉ trong một ngày. Bài viết này trình bày bảng tính, các bẫy chi phí, và những workload mà Workers thắng hoặc thua về giá.
Bài viết này dành cho ai
Backend developer đang cân nhắc Cloudflare Workers cho production — hoặc đang chạy trên Workers và đang tìm hiểu tại sao hoá đơn cao hơn dự kiến. Nếu bạn đang so sánh giữa Workers, AWS Lambda, và Vercel cho dự án mới, bảng so sánh trong bài sẽ giúp bạn ước tính chi phí trước khi quyết định. Để tìm hiểu về khả năng của runtime, xem đánh giá Cloudflare Workers với phân tích chi tiết về developer experience, giới hạn, và tính năng.
Cách tính phí Cloudflare Workers thực tế
Workers chuyển sang tính phí theo CPU time vào tháng 10 năm 2023. Bạn trả tiền cho thời gian code đang thực thi, không phải tổng thời gian wall-clock của request. Nếu Worker của bạn mất 100ms chờ D1 query và 5ms thực thi JavaScript, bạn bị tính 5ms CPU time — không phải 105ms.
Đây là lý do workload nặng I/O rẻ hơn đáng kể trên Workers so với Lambda. Lambda tính tiền theo wall-clock ngay từ đầu, nên nếu function của bạn mất 90% thời gian chờ DynamoDB, bạn vẫn trả cho toàn bộ. Workers thì không. Với một backend chủ yếu đọc database và gọi API bên ngoài — tức là hầu hết các backend — sự khác biệt này có ý nghĩa thực sự về tiền.
Một hoá đơn Workers bao gồm năm thành phần:
| Thành phần | Phạm vi tính phí |
|---|---|
| Requests | Mỗi HTTP request đến Worker |
| CPU time | Thời gian thực thi code, tính bằng millisecond |
| KV operations | Các thao tác đọc và ghi vào Workers KV |
| D1 operations | Các thao tác đọc và ghi vào D1 SQLite |
| Durable Objects | Số request và thời gian chạy của Durable Object instance |
R2 object storage có cách tính phí riêng nằm ngoài bảng này, được trình bày ở phần các bẫy chi phí.
Gói miễn phí và giới hạn gói Paid
Free tier của Workers giới hạn ở 100,000 request/ngày và không có SLA. Để chạy production, bạn cần gói Paid ở mức $5/tháng. Khoản $5 đó bao gồm:
| Thành phần | Có trong gói Paid |
|---|---|
| Requests | 10M/tháng |
| CPU time | 30M CPU-milliseconds/tháng |
| KV reads | 10M/tháng |
| KV writes | 1M/tháng |
| D1 reads | 5M/tháng |
| D1 writes | 100K/tháng |
| R2 storage | 10 GB/tháng |
| R2 Class B ops (reads) | 10M/tháng |
Vượt quá các giới hạn này, giá overage sẽ áp dụng:
| Thành phần | Giá overage |
|---|---|
| Requests | $0.30/triệu |
| CPU time | $0.02/triệu CPU-ms |
| KV reads | $0.50/triệu |
| KV writes | $5.00/triệu |
| D1 reads | $0.001/triệu |
| D1 writes | $1.00/triệu |
| R2 storage | $0.015/GB-tháng |
| R2 Class A ops (writes, deletes, list) | $4.50/triệu |
| Durable Objects requests | $0.15/triệu |
| Durable Objects duration | $12.50/triệu GB-seconds |
| DO SQLite storage (từ 7/1/2026) | $0.20/GB-tháng |
| Log events | $0.60/triệu |
Giá KV write — $5.00/triệu, gấp 10 lần giá read — là nơi hầu hết những bất ngờ về ngân sách xuất hiện. Hãy nhớ con số này khi đọc các kịch bản bên dưới.
Ba kịch bản với bảng tính chi tiết
Kịch bản 1: side project cá nhân, lưu session nặng KV
Một side project công cụ dành cho developer nhận 5 triệu request/ngày (150M/tháng), dùng KV để lưu dữ liệu session. Mỗi request kích hoạt một KV read và một KV write.
| Khoản phí | Khối lượng | Giá | Chi phí |
|---|---|---|---|
| Gói base | — | — | $5.00 |
| Requests (150M – 10M đã bao gồm) | 140M | $0.30/M | $42.00 |
| KV reads (150M – 10M đã bao gồm) | 140M | $0.50/M | $70.00 |
| KV writes (150M – 1M đã bao gồm) | 149M | $5.00/M | $745.00 |
| CPU time (ước tính 3ms avg/request) | 450M CPU-ms – 30M = 420M | $0.02/M | $8.40 |
| Tổng | ~$870/tháng |
Con số này trông đáng sợ. Đúng là vậy. Nhưng hãy chú ý rằng khối lượng KV write (150M/tháng từ 5M request/ngày) chính là nguyên nhân. Nếu bạn chỉ ghi vào KV một lần lúc tạo session — và cache dữ liệu session trong bộ nhớ suốt vòng đời của Worker instance — khối lượng write giảm xuống hơn 100 lần.
Phiên bản thực tế hơn của cùng dự án, với session được tạo khi đăng nhập và chỉ đọc ở các request tiếp theo:
| Khoản phí | Khối lượng | Giá | Chi phí |
|---|---|---|---|
| Gói base | — | — | $5.00 |
| Requests (150M – 10M đã bao gồm) | 140M | $0.30/M | $42.00 |
| KV reads (150M – 10M đã bao gồm) | 140M | $0.50/M | $70.00 |
| KV writes (ước tính 1M session mới/tháng) | 0 overage | — | $0.00 |
| CPU time (ước tính 3ms avg) | 420M overage | $0.02/M | $8.40 |
| Tổng | ~$125/tháng |
Vẫn chưa phải $5. Ở 150M request/tháng bạn đang là một ứng dụng có traffic thực sự, và chỉ riêng request overage đã là $42. Nhưng sự chênh lệch giữa $870 và $125 hoàn toàn đến từ pattern write — không phải từ khối lượng request.
Dữ liệu gốc từ researcher ước tính ~$158/tháng cho kịch bản này với write được tối ưu một phần. Con số đó hợp lý.
Kịch bản 2: backend SaaS, D1 + Durable Objects ở mức vừa phải
Một API backend cho SaaS dạng subscription: 10M request/tháng, mỗi request thực hiện khoảng 2 D1 read và 0.1 D1 write trung bình (read chiếm đa số), cộng thêm 500K Durable Object request cho quản lý session với thời gian giữ trung bình thấp.
| Khoản phí | Khối lượng | Giá | Chi phí |
|---|---|---|---|
| Gói base | — | — | $5.00 |
| Requests | 10M đã bao gồm | — | $0.00 |
| D1 reads (20M – 5M đã bao gồm) | 15M | $0.001/M | $0.015 |
| D1 writes (1M – 100K đã bao gồm) | 900K | $1.00/M | $0.90 |
| DO requests (500K) | 500K | $0.15/M | $0.075 |
| DO duration (ước tính 50ms avg, 128MB) | 500K × 0.05s × 0.125 GB = ~3,125 GB-sec | $12.50/M GB-sec | $0.039 |
| CPU time (ước tính 15ms avg) | 150M CPU-ms – 30M = 120M | $0.02/M | $2.40 |
| Tổng | ~$8.40/tháng |
Đây là nơi Workers toả sáng. Một SaaS backend ở 10M request/tháng với database thực sự chạy dưới $10/tháng nếu pattern write hợp lý. Các giới hạn bao gồm trong gói làm được nhiều việc ở quy mô này. Cùng workload trên AWS Lambda cộng API Gateway tốn $38–45/tháng.
Kịch bản 3: xử lý ảnh nặng compute
Resize hoặc biến đổi ảnh: 1M request/tháng, mỗi request dùng ~80ms CPU time thực tế.
| Khoản phí | Khối lượng | Giá | Chi phí |
|---|---|---|---|
| Gói base | — | — | $5.00 |
| Requests | 1M đã bao gồm | — | $0.00 |
| CPU time (80M – 30M đã bao gồm) | 50M CPU-ms | $0.02/M | $1.00 |
| Tổng | ~$6/tháng |
Workers vẫn rẻ ở lượng nhỏ. Scale lên 10M request/tháng ở 80ms CPU mỗi cái:
| Khoản phí | Khối lượng | Giá | Chi phí |
|---|---|---|---|
| Gói base | — | — | $5.00 |
| Requests (10M – 10M đã bao gồm) | 0 overage | — | $0.00 |
| CPU time (800M – 30M đã bao gồm) | 770M CPU-ms | $0.02/M | $15.40 |
| Tổng | ~$20/tháng |
Vẫn rẻ hơn Lambda ở quy mô này. Nhưng Workers giới hạn bộ nhớ ở 128MB, điều này hạn chế độ phức tạp của việc xử lý ảnh trong bộ nhớ. Với các phép biến đổi file lớn, bạn sẽ chạm giới hạn 128MB trước khi chi phí trở thành vấn đề.
So sánh các nền tảng ở 10M request/tháng
Workload cố định: 10M request/tháng, 15ms CPU time trung bình, pattern đọc nhiều.
| Nền tảng | Chi phí hàng tháng | Điểm khác biệt chính |
|---|---|---|
| Cloudflare Workers | ~$5 | Gói base đã bao gồm workload này |
| AWS Lambda + API Gateway | ~$38 | Tính phí wall-clock + phí per-call API GW |
| Vercel Pro | $20/user/tháng + compute | Tính phí theo người dùng; compute vượt giới hạn |
Lambda thắng Workers khi mỗi invocation trung bình hơn ~100ms CPU ở lượng request cao. Vượt ngưỡng đó, khả năng phân bổ đến 3,008MB bộ nhớ của Lambda (và tương ứng nhiều CPU hơn) thay đổi bảng tính. Workers bị giới hạn cứng ở 128MB và tính tiền theo CPU-ms — không có cách nào mua instance nhanh hơn.
Với workload nặng I/O dưới ngưỡng 128MB, Workers thắng. Với workload nặng compute cần nhiều bộ nhớ, Lambda linh hoạt hơn.
Để so sánh chi tiết hơn về latency, hệ sinh thái, và cold start, xem Cloudflare Workers vs AWS Lambda.
Năm bẫy chi phí ẩn
1. D1 không có giới hạn cứng — vụ hoá đơn $4,868
Vào tháng 1 năm 2026, một developer thức dậy với hoá đơn Cloudflare $4,868. Một bug trong codebase của họ đã kích hoạt vòng lặp vô tận ghi D1. Kết quả: 1.42 tỷ thao tác write trong một ngày ở mức $1.00/triệu. D1 không có giới hạn cứng về thanh toán — không có circuit breaker nào trong nền tảng.
Cloudflare cuối cùng đã miễn hoá đơn đó, nhưng mất 18 ngày. Toàn bộ bài postmortem tại littlebearapps.com/blog/d1-billing-disaster-circuit-breakers/.
Lỗi này không phải đặc thù của D1 — bất kỳ dịch vụ nào tính phí theo lượng đều có thể phát sinh hoá đơn khổng lồ từ một bug vòng lặp. Chi phí read của D1 thấp ($0.001/M) khiến nó có vẻ rẻ; chi phí write ($1.00/M, cao hơn read 1,000 lần) mới là thứ thực sự nguy hiểm.
Ba điều cần làm trước khi deploy bất kỳ cron job hoặc scheduled Worker nào gọi D1:
// Giới hạn D1 writes bằng bộ đếm KV
const key = `d1-write-counter:${new Date().toISOString().slice(0, 10)}`; // YYYY-MM-DD
const count = parseInt(await env.RATE_LIMIT.get(key) ?? '0', 10);
const DAILY_WRITE_LIMIT = 1_000_000; // điều chỉnh theo mức tối đa dự kiến
if (count >= DAILY_WRITE_LIMIT) {
throw new Error(`D1 daily write limit reached: ${count}`);
}
await env.RATE_LIMIT.put(key, String(count + 1), { expirationTtl: 86400 });
// an toàn để thực hiện D1 write
Ngoài ra: thiết lập cảnh báo thanh toán Cloudflare ở ngưỡng dollar mà bạn sẽ để ý — trước khi code được deploy. Nền tảng có tính năng này; hầu hết mọi người không cấu hình.
Để tìm hiểu kỹ hơn về tính năng D1, giới hạn query, và SQLite compatibility, xem đánh giá Cloudflare D1.
2. Bất cân xứng KV write: đắt hơn read 10 lần
KV reads tính $0.50/triệu. KV writes tính $5.00/triệu. Sự bất cân xứng này tồn tại vì KV write được replicate trên toàn mạng Cloudflare — chi phí write phản ánh cơ sở hạ tầng thực tế.
Các pattern dễ vướng phải điều này:
- Ghi state session trên mỗi request đã xác thực (làm mới auth token, cập nhật trạng thái online của user)
- Dùng KV làm bộ đếm đơn giản hoặc accumulator cho analytics
- Lưu metadata theo từng request “chỉ để debug”
Pattern thay thế cho hầu hết các trường hợp nặng KV write: chỉ ghi vào KV khi có thay đổi state thực sự (đăng nhập, đăng xuất, cập nhật tuỳ chọn). Cache trong bộ nhớ trong phạm vi Worker instance suốt vòng đời của nó. Workers Analytics Engine là công cụ phù hợp cho dữ liệu event/metrics — mô hình tính phí khác, được xây dựng cho workload nặng append.
3. Durable Objects không dùng Hibernation API: tốn tiền khi WebSocket nhàn rỗi
Durable Objects tính phí theo thời gian wall-clock: $12.50/triệu GB-seconds. Một Durable Object vẫn “sống” — và vẫn tính tiền — miễn là có kết nối WebSocket nào giữ nó hoạt động.
Xét 1,000 kết nối WebSocket liên tục, mỗi kết nối giữ một DO instance mở suốt 24 giờ:
1,000 DOs × 86,400 seconds × (128MB / 1,024) GB
= 1,000 × 86,400 × 0.125
= 10,800,000 GB-seconds/ngày
× 30 ngày = 324,000,000 GB-seconds/tháng
÷ 1,000,000 × $12.50 = $4,050/tháng
Hibernation API tạm dừng một DO khi tất cả kết nối WebSocket của nó rảnh rỗi, chỉ tiếp tục khi có tin nhắn mới đến. Với hibernation, cách tính phí chuyển từ wall-clock sang event-driven — bạn chỉ trả tiền cho burst CPU ngắn xử lý mỗi tin nhắn, không phải cho việc ngồi không giữa các tin nhắn.
Với 1,000 kết nối và traffic thông thường 1 tin nhắn/giây:
1,000 DOs × 1,000 messages/ngày × 5ms CPU/message
= 5,000,000 CPU-ms/ngày = 150,000,000 CPU-ms/tháng
= 150M CPU-ms – 30M đã bao gồm = 120M overage
120M × $0.02/M CPU-ms = $2.40/tháng
Đó là sự chênh lệch giữa $4,050 và $2.40. Hibernation API không phải tuỳ chọn cho WebSocket server production. Triển khai từ ngày đầu, không phải sau khi thấy hoá đơn wall-clock. Liveblocks xử lý 500 triệu WebSocket message/ngày trên Workers bằng chính pattern này.
4. Logging ồ ạt: $0.60/triệu log event
Workers logging (Logpush, Console API) tính $0.60/triệu log event. Với logging dày đặc — 100 event/request, 10M request/tháng — đó là 1 tỷ log event = $600/tháng chỉ cho logging.
Điều này dễ bỏ sót trong quá trình phát triển, khi bạn không bao giờ đạt đến volume đó. Logging request/response dày đặc không tốn gì ở 10,000 request/ngày sẽ tốn $600/tháng ở 10M request/tháng.
Giải pháp phổ biến: structured logging kết hợp sampling. Trong production, log lỗi và request chậm vô điều kiện; sample mọi thứ còn lại ở mức 1%. 1% sample trên info-level logs ở 10M request/tháng = 100K event được sample/tháng, nằm trong giới hạn bao gồm.
5. R2 Class A operations: không mất phí egress ≠ miễn phí hoàn toàn
Điểm nổi bật của R2 là không tính phí egress — không có khoản phí nào cho dữ liệu rời Cloudflare đến người dùng. Điều này có thực và có ý nghĩa. Phí egress của S3 ở quy mô lớn là một khoản đáng kể; R2 loại bỏ hoàn toàn.
Nhưng R2 vẫn tính phí cho Class A operations: ghi, xoá, và list ở $4.50/triệu. Phục vụ một CDN nặng đọc — kho lưu trữ asset tĩnh, thư viện ảnh — gần như miễn phí ngoài chi phí lưu trữ. Nhưng các trường hợp nặng write trả tiền cho mỗi object được tải lên.
10M object upload/tháng = $45 chi phí Class A ops. Thực ra rẻ hơn S3 PUT requests ở $0.005/1000 ($50/M), nhưng cách diễn đạt “zero egress” có thể tạo ra ấn tượng rằng R2 hoàn toàn miễn phí. Nó miễn phí để phục vụ; không miễn phí để ghi.
Với lưu trữ log, thu thập event, hoặc bất kỳ pattern nào upload thường xuyên, hãy tính Class A ops trước khi cho rằng R2 không tốn gì.
Production thực tế ở quy mô lớn
Baselime: giảm 83% chi phí khi chuyển từ AWS sang Cloudflare
Baselime là một SaaS observability đã chuyển toàn bộ hạ tầng từ AWS sang Cloudflare vào năm 2023. Chi phí compute hàng ngày giảm từ $1,940 xuống $325 — giảm 83%. Workload của họ nặng I/O: nhận log lines, tracing spans, truy vấn qua các event dataset của khách hàng. Đúng loại workload mà cách tính phí CPU time của Workers hỗ trợ tốt nhất. Họ đang trả Lambda tiền cho thời gian wall-clock trên workload mà hơn 80% là chờ I/O.
Source: blog.cloudflare.com/80-percent-lower-cloud-cost-how-baselime-moved-from-aws-to-cloudflare/
Liveblocks: 500 triệu WebSocket message/ngày
Liveblocks vận hành hạ tầng collaborative editing — multiplayer cursors, shared state, presence — trên Workers với Durable Objects. Ở 500 triệu WebSocket message/ngày, Durable Objects với Hibernation API là kiến trúc bắt buộc. Không có hibernation, chi phí DO duration theo wall-clock sẽ không thể chịu được ở lượng tin nhắn đó. Đây là deployment production Workers lớn nhất được công bố mà chúng tôi biết, và nó được xây dựng trên đúng pattern (DO + hibernation) mà phần tính phí ở trên đã chỉ ra là thiết yếu.
Kết luận
Workers là lựa chọn đúng khi:
- Backend của bạn nặng I/O — database query, gọi API bên ngoài, bất cứ thứ gì chờ mạng. Cách tính phí CPU time khiến những workload này rẻ hơn Lambda đáng kể.
- Bạn đang thay thế Lambda + API Gateway cho một API xử lý lượng request cao với CPU thấp mỗi request. Ở 10M request/tháng với 15ms CPU trung bình, Workers tốn ~$5 so với Lambda ~$38. Khoảng cách đó là có thực.
- Bạn cần object storage không tính phí egress. R2 tốt hơn S3 cho các CDN pattern nặng đọc, và việc không tính phí egress tích lũy theo thời gian.
- Bạn đang xây dựng một CRUD API đơn giản ở quy mô vừa phải. Các giới hạn bao gồm đủ rộng để nhiều ứng dụng traffic thấp đến vừa phải nằm trong khoảng $5–15/tháng.
Cần cẩn thận khi:
- Bạn ghi vào KV thường xuyên. Hãy thiết kế pattern truy cập KV nghiêng về đọc ngay từ đầu. Nếu bạn đang ghi trên mỗi request, hãy xem lại kiến trúc trước khi đạt quy mô.
- Bạn dùng D1 trong bất kỳ process tự động nào — cron job, queue consumer, event-driven pipeline. Việc thiếu giới hạn cứng không phải rủi ro lý thuyết. Hãy thêm rate limiting, thêm cảnh báo thanh toán, và thêm circuit breaker. Làm điều này trước khi code được deploy.
- Durable Objects của bạn giữ kết nối WebSocket. Hibernation API là bắt buộc với production. Triển khai từ ngày đầu, không phải sau khi thấy hoá đơn wall-clock.
- Workers của bạn nặng compute với CPU trung bình trên ~50ms. Workers vẫn thắng Lambda trong hầu hết trường hợp, nhưng lợi thế thu hẹp lại, và bạn bị giới hạn ở 128MB bộ nhớ — điều này hạn chế những gì bạn có thể làm trong process.
- Bạn bật verbose logging trong production. Structured, sampled logging không phải điều tốt nên có; ở 10M request/tháng đó là quyết định $600/tháng.
Kinh nghiệm chung về ngân sách: $15–50/tháng cho ứng dụng production vừa phải dùng Workers, KV reads, và D1. $50–200/tháng cho các ứng dụng nặng write hoặc có Durable Objects ở quy mô. $200+ chỉ khi bạn kết hợp nhiều pattern nặng write cùng lúc hoặc chạy workload nặng compute ở lượng rất cao.
Tiêu đề $5/tháng là có thực cho các API nặng I/O ở đến 10M request/tháng. Khoảng cách giữa tiêu đề và hoá đơn thực tế hầu như hoàn toàn đến từ KV writes, D1 write volume, và Durable Object duration không dùng hibernation. Hiểu ba thành phần tính phí đó và bạn có thể dự đoán hoá đơn của mình chính xác trước khi bất ngờ xảy ra.