Cách tôi tối ưu hóa chuyển hướng QR Code xuống dưới 50ms với Cloudflare Workers
Hầu hết các dịch vụ QR Code xử lý chuyển hướng qua máy chủ chính, gây độ trễ lớn. Bài viết này chia sẻ cách sử dụng Cloudflare Workers để đưa logic tới Edge, giảm thời gian phản hồi xuống dưới 50ms mà vẫn đảm bảo thu thập dữ liệu phân tích.

Đa số các dịch vụ QR Code hiện nay đều chạy chuyển hướng (redirect) thông qua máy chủ ứng dụng chính của họ. Đây thực sự là một ý tưởng tồi, và dưới đây là cách tôi giải quyết vấn đề này bằng Cloudflare Workers cho dự án OwnQR.
Vấn đề gặp phải
Khi ai đó quét một mã QR động, quy trình sẽ diễn ra theo 3 bước:
- Điện thoại mở một URL (ví dụ:
oq.link/abc123) - Máy chủ tìm kiếm xem
abc123cần chuyển hướng đến đâu - Người dùng được đưa đến đích
Nếu bạn thực hiện quy trình này thông qua một ứng dụng Next.js/Vercel, bạn sẽ phải đối mặt với các vấn đề sau:
- Cold starts (Khởi động lạnh): Tốn hơn 500ms trên môi trường serverless.
- Vùng đơn nhất (Single region): Người dùng ở Tokyo, máy chủ ở Virginia = độ trễ 200ms.
- Truy vấn cơ sở dữ liệu: Thêm khoảng 50-100ms nữa.
Tổng cộng là hơn 750ms trước khi người dùng thấy nội dung nào. Với một lần quét mã QR (người dùng mong muốn nó diễn ra tức thì), điều này tạo cảm giác ứng dụng bị lỗi.
Giải pháp: Chuyển hướng tại Edge
Tôi đã chuyển logic chuyển hướng sang một Cloudflare Worker. Toàn bộ quá trình tra cứu và chuyển hướng diễn ra tại nút Edge gần nhất:
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
const url = new URL(request.url)
const match = url.pathname.match(/^\/r\/([a-zA-Z0-9]+)$/)
if (!match) return new Response('Not Found', { status: 404 })
const slug = match[1]
const qrCode = await getDestination(slug, env)
if (!qrCode) return new Response('QR Code not found', { status: 404 })
// Ghi lại sự kiện quét trong nền (không chặn)
ctx.waitUntil(logScanEvent(qrCode.id, request, env, request.cf))
// Chuyển hướng 302 (không dùng 301 -- cho phép thay đổi URL)
return Response.redirect(qrCode.destination_url, 302)
},
}
Tại sao dùng mã 302 thay vì 301?
Mã QR động cho phép người dùng thay đổi URL đích bất cứ lúc nào. Mã 301 (chuyển hướng vĩnh viễn) sẽ được trình duyệt lưu vào bộ nhớ đệm (cache) — nếu người dùng thay đổi liên kết, những người quay lại sẽ vẫn thấy đích cũ. Việc sử dụng 302 đảm bảo mọi lần quét đều truy xuất đến URL mới nhất.
Dữ liệu địa lý miễn phí với request.cf
Cloudflare cung cấp thành phố, quốc gia, vĩ độ và kinh độ trên mọi yêu cầu thông qua đối tượng request.cf — không cần bất kỳ API địa lý bên ngoài nào:
async function logScanEvent(qrId: string, request: Request, env: Env, cf: any) {
const ua = request.headers.get('User-Agent') || ''
await fetch(`${env.SUPABASE_URL}/rest/v1/scan_events`, {
method: 'POST',
headers: {
apikey: env.SUPABASE_ANON_KEY,
Authorization: `Bearer ${env.SUPABASE_ANON_KEY}`,
'Content-Type': 'application/json',
Prefer: 'return=minimal',
},
body: JSON.stringify({
qr_id: qrId,
device_type: getDeviceType(ua),
os_type: getOS(ua),
ip_city: cf?.city || null,
ip_country: cf?.country || null,
}),
})
}
Phân tích không chặn với ctx.waitUntil()
Chuyển hướng được kích hoạt ngay lập tức. Việc ghi nhật ký phân tích diễn ra ở nền thông qua ctx.waitUntil(). Người dùng không phải chờ thao tác chèn dữ liệu vào cơ sở dữ liệu hoàn tất.
Kết quả đạt được
| Chỉ số | Trước (Next.js) | Sau (Workers) |
|---|---|---|
| Thời gian chuyển hướng trung bình | ~750ms | ~40ms |
| Cold starts | Có | Không |
| Địa điểm Edge | 1 vùng | 300+ thành phố |
| Chi phí hạ tầng | Có trong Vercel | ~$5/tháng |
Kiến trúc hệ thống
Người dùng quét QR -> Cloudflare Worker (edge) -> Chuyển hướng 302
| (async, không chặn)
Ghi log vào Supabase
(thiết bị, thành phố, quốc gia, thời gian)
Ứng dụng chính (Next.js trên Vercel) xử lý việc tạo mã QR, bảng điều khiển, thanh toán và tùy chỉnh thiết kế. Worker chỉ xử lý chuyển hướng — thứ duy nhất cần tốc độ toàn cầu.
Mã nguồn mở
Tôi đã mã nguồn mở Worker chuyển hướng này tại: cloudflare-qr-redirect trên GitHub
Không có bất kỳ phụ thuộc npm nào — chỉ sử dụng các API tích hợp sẵn của Cloudflare Workers + Supabase REST.
Về sản phẩm
Kiến trúc này đang vận hành OwnQR — một trình tạo mã QR nơi bạn trả $15 một lần thay vì đăng ký trả phí hàng tháng. Nếu bạn mệt mỏi vì các dịch vụ QR Code thu phí $7-15/tháng chỉ cho một đường dẫn, hãy thử nghiệm sản phẩm này.
Bạn có câu hỏi về thiết lập Cloudflare Workers? Hãy để lại bình luận bên dưới.
Bài viết liên quan

Phần mềm
Anthropic ra mắt Claude Opus 4.7: Nâng cấp mạnh mẽ cho lập trình nhưng vẫn thua Mythos Preview
16 tháng 4, 2026

Công nghệ
Qwen3.6-35B-A3B: Quyền năng Lập trình Agentic, Nay Đã Mở Cửa Cho Tất Cả
16 tháng 4, 2026

Công nghệ
Spotify thắng kiện 322 triệu USD từ nhóm pirate Anna's Archive nhưng đối mặt với bài toán thu hồi
16 tháng 4, 2026
