API kiểm tra lượt xem Velog (beta)
(github.com/day1swhan)Bối cảnh phát triển và ý tưởng triển khai
- Tôi muốn biết lượt xem của các bài viết đã đăng trên Velog, nhưng lần nào cũng phải đăng nhập để kiểm tra thì khá phiền
- Có thể reverse-engineer API lượt xem nội bộ của Velog, nhưng như vậy có vẻ sẽ rắc rối và khả năng mở rộng (ví dụ: thông báo khách truy cập) cũng kém
- Tôi nhớ tới việc các dịch vụ mail nội địa ngày trước từng cung cấp tính năng xác nhận đã đọc bằng ảnh pixel
- Velog hỗ trợ viết bài bằng cú pháp Markdown
- Trình duyệt không chặn các lời gọi ảnh đơn giản ngay cả khi là miền cross-site
- Nếu chèn một ảnh trong suốt 1x1 pixel vào bài viết, mỗi khi bài được xem, phía máy chủ có thể lưu lại bản ghi gọi
- Phần lớn bài viết của người dùng Velog không có quá 1.000 lượt truy cập mỗi ngày. Với mức traffic này thì dùng Workers KV là đủ
- Không chỉ giới hạn ở Velog; có thể dùng trên mọi nền tảng hỗ trợ chèn ảnh bằng cú pháp Markdown (và cho phép cung cấp ảnh từ miền của người dùng)
Cách hoạt động
- Gán cho ảnh một giá trị định danh (
slug), sau đó trả phản hồi bằng Workers có thể lập trình thay vì CDN, rồi dùng giá trị định danh đó làmKey prefixtrong KV để lưu bản ghi gọi là có thể dễ dàng lấy được page view - Nếu dùng hàm
Hashđể tạo key từ ngày, ip, userAgent, giá trị định danh ảnh thì có thể xử lý trùng lặp lượt truy cập ở mức tối thiểu- HASH: băm 128 bit dựa trên SHA-256, mã hóa bằng base64url (22 ký tự).
- KEY:
view:${slug}:${hash}. - VALUE: UserAgent, Date...
- Gói miễn phí của Workers KV hỗ trợ 1.000 PUT và LIST mỗi ngày.
- PUT: có thể lưu thông tin đếm khách truy cập 1.000 lần mỗi ngày
- LIST: có thể cung cấp thông tin page view hơn 1.000 lần mỗi ngày
- Yêu cầu truy vấn page view dùng lệnh LIST; chỉ cần lấy dữ liệu với thông tin giá trị định danh (
slug) làmprefixrồi đếm đơn giản- Vì việc truy vấn page view không quá cần tính thời gian thực nên nếu cache giá trị phản hồi hợp lý, có thể xử lý hơn 1.000 yêu cầu mỗi ngày
Giới hạn
Do ưu tiên phát triển nhanh nên đã dùng KV, một loại kho lưu trữ đơn giản, vì vậy có các giới hạn như sau.
- Eventual consistency: yêu cầu PUT của Workers KV không theo thời gian thực. Nếu thật sự cần tính thời gian thực thì phải dùng Durable Objects(DO).
- Phụ thuộc vào LIST: cách đếm dùng lệnh LIST sẽ ngày càng chậm theo thời gian (giả sử page view vẫn phát sinh đều đặn), vì số lượng KEY cần lấy tăng dần. Cần cân nhắc cập nhật cấu trúc lưu trữ định kỳ bằng tác vụ Cron, hoặc dùng DO hay Analytics Engine.
Dự kiến hỗ trợ
Tôi dự định sẽ bổ sung các tính năng sau trong thời gian sớm nhất có thể.
- Sắp xếp theo ngày: nếu dùng Unix Time, cách tôi đã dùng để sắp xếp bình luận mới nhất trong bài Tự tạo API bình luận blog serverless trong 30 phút, thì có thể cung cấp danh sách được sắp xếp theo phiên mới nhất
- Bảo mật API: sẽ hỗ trợ bằng cách thêm middleware. Dự kiến dùng header HTTP Authorization
- Rate Limit: với người dùng Velog nổi tiếng, có thể sẽ có những người bị mù quáng bởi thời điểm và sự ghen tị gửi các yêu cầu độc hại, nên cần có biện pháp đối phó. Có lẽ vì bản thân tôi không thuộc trường hợp đó nên tính năng này sẽ được thêm sau cùng...
- Tìm kiếm: sẽ hỗ trợ thêm qua API
- Ngày: tìm kiếm theo ngày cụ thể hoặc theo khoảng thời gian. Cần thay đổi cấu trúc KEY
- Phiên: tìm kiếm thông tin hoạt động của một phiên cụ thể. Hiện thông tin phiên có hiệu lực trong một ngày cho mỗi bài đăng. Cần xem xét chính sách bảo vệ thông tin cá nhân
- Trình duyệt/OS: dự kiến cung cấp dựa trên thông tin parse từ UserAgent. Dù không quá tinh vi nhưng vẫn có thể nắm được tổng quan
- Service API: dự kiến cung cấp API dưới dạng dịch vụ để bất kỳ ai cũng có thể dễ dàng sử dụng bằng xác thực email + cấp khóa cá nhân
- Webhook: cung cấp yêu cầu POST khi phát sinh sự kiện page view. Có thể dùng Slack, công cụ mà các nhà phát triển ưa thích, để nhận thông báo
- Email: tính năng thông báo cổ điển nhưng tiện lợi cho những người dùng ngại xử lý webhook
- Custom campaign: cung cấp giá trị định danh ảnh (
slug) tích hợp cho các sự kiện đã thiết lập (ví dụ: đạt một mốc lượt xem nhất định)
Bổ sung
- Những ai quan tâm tới cấu trúc hoạt động nội bộ có thể tham khảo Nhật ký phát triển API kiểm tra lượt xem Velog bắt đầu từ 1x1 pixel.
- Cách cài đặt và triển khai, API Reference chi tiết, cùng toàn bộ mã nguồn có thể xem tại kho Github.
Chưa có bình luận nào.