Giới thiệu
Bạn đã bao giờ tự hỏi các nền tảng như Codeshare được xây dựng như thế nào? Bạn đã bao giờ thử giải quyết các thách thức mở rộng quy mô dịch vụ như vậy trong khi duy trì trải nghiệm phát triển tốt cho bản thân? Khi tôi quyết định xây dựng Bytecrowds, tôi phải học cách làm tất cả những điều này. Sau khi nghiên cứu kỹ lưỡng và quyết định sử dụng Yjs để cung cấp khả năng chia sẻ văn bản, đến lúc chọn cơ sở dữ liệu. Với nhiều lựa chọn có sẵn trên thị trường, tôi thu hẹp danh sách bằng một từ khóa thiết yếu: đơn giản
Tại sao Upstash?
Ngay trước khi khám phá Upstash, tôi đã quan tâm đến Redis® vì API đơn giản của nó. Tuy nhiên, sử dụng nó làm database chính đi kèm thách thức như mở rộng quy mô (bạn có thể cần này cho caching) và duy trì persistence. Đồng thời, trước khi đảm bảo bất kỳ tài trợ nào, bạn phải rất cẩn thận về ngân sách cho phần mềm mã nguồn mở. Bạn có trả tiền cho sức mạnh tính toán ngay cả khi nó không được sử dụng lúc nào? Bạn có thể xử lý spike traffic đột ngột và sẵn sàng dành hàng giờ làm việc trên hạ tầng thay vì làm việc hướng tới xuất bản tính năng mới, cải thiện cái có sẵn, hoặc sửa một số bug? Tôi, một mặt, thì không. Vì vậy tôi tìm thấy Upstash.
Lợi ích Upstash Redis đáp ứng 3 tiêu chí thiết yếu của tôi: nó dễ sử dụng, dễ mở rộng, và linh hoạt. Kết hợp với độ trễ thấp, REST sdk có sẵn để dùng trong client serverless (một yêu cầu cho Bytecrowds), global replication và kế hoạch trả tiền theo sử dụng cho sức mạnh tính toán, để chỉ vài cái, và bạn sẽ hiểu tại sao tôi chọn nó cho dự án của mình.
Sử dụng Redis® khắp ứng dụng
Hãy tìm hiểu Redis® có thể được dùng làm database chính của dự án, đáp ứng nhu cầu của nhiều dịch vụ. Để hiểu ngữ cảnh, đây là sơ đồ luồng của Bytecrowds:

Nó sử dụng Ably để đồng bộ văn bản giữa các client và một analytics engine tùy chỉnh thu thập dữ liệu dựa trên địa chỉ IP của yêu cầu.
Kho lưu trữ chính
Một bytecrowd có dạng Redis® hash với các thuộc tính sau:
{
text: string,
language: string,
authorizedEmails: undefined || string array
}
Chúng ta cập nhật hash một khi một thuộc tính của nó thay đổi, với độ trễ "x" giây giữa các lần cập nhật. Trong production, điều này hiện được đặt thành 100 mili-giây.
Xác thực và phân quyền
Xác thực
Vì Bytecrowds dùng Next.js, lựa chọn vững chắc cho GitHub OAuth là Auth.js. May mắn thay, chúng ta cũng có thể tận dụng adapter Upstash để lưu session, cho phép chúng ta dùng Redis® khắp ứng dụng.
Phân quyền
Bytecrowds xử lý phân quyền bằng cách tạo, theo yêu cầu, trường authorizedEmails bất biến từ API sau khi đặt. Một trong những điều tôi thích về Redis® là vô số hàm có sẵn cho các thao tác thường quy cũng được thiết kế thuật toán để hiệu quả. Để đưa ra ví dụ, tất cả những gì chúng ta cần làm để kiểm tra xem authorizedEmails đã được đặt chưa là dùng lệnh HEXISTS, có độ phức tạp O(1).
Analytics
Bytecrowds sử dụng hệ thống analytics xử lý hai loại dữ liệu:
- stat của một ngày, có dạng Redis® hash, được đặt tên như
year month dayvới các thuộc tính sau:
{
countries: string array,
hits: integer,
pages: string array,
uniqueVisitors: integer,
addresses: string array,
continents: string array
}
Ở đâu addresses là mảng địa chỉ IP được mã hóa SHA256 dùng để xác định số lượng người truy cập duy nhất.
- 3 key tên
continents,countries, vàpagescho đó Redis® sorted sets được dùng để lưu trữ dữ liệu. Bằng cách lưu mọi stat cùng với count của nó ("score", cho sorted set), chúng ta có thể dễ dàng truy vấn hoặc sắp xếp chúng dùng lệnh như SORT hoặc SORT_RO. Sự đơn giản của Redis thể hiện lại.
Nếu bạn tò mò về code đằng sau, xem https://github.com/Bytecrowds/analytics/blob/main/src/index.js
Lưu ý: Trong kịch bản phức tạp hơn, bạn có thể áp dụng thay đổi cho hệ thống này, như lưu dữ liệu thô trước khi xử lý và dùng công cụ stream processing như Apache Kafka (Upstash cũng lo việc này, xem docs).
Xem trực tiếp
Muốn xem Bytecrowds hoạt động? Đi tới https://www.bytecrowds.com, nhấp nút "new bytecrowd" và mở link trong nhiều tab. Khi bạn bắt đầu viết, bạn sẽ thấy code được sao chép qua tất cả client kết nối.
Kết thúc
Không phải bí mật rằng làm maintainer hoạt động đơn lẻ cho dự án mã nguồn mở là khó khăn, nhưng có đúng công cụ và hạ tầng auto-scaling có thể là hỗ trợ tuyệt vời giúp bạn tiếp tục làm việc trên dự án tuyệt vời, mà không phải lo lắng về traffic spike. Đã tin dùng Upstash Redis®? Đăng ký tài khoản miễn phí, không cần thẻ tín dụng.
Để xem toàn bộ code, kiểm tra GitHub repository. Nếu bạn có câu hỏi hoặc phản hồi về bài viết này, liên hệ tôi tại tudor.zgimbau@gmail.com.