Mã nguồn mở URL Shortener (phiên bản Rust) được hoàn thiện sau 10 lần nâng cấp
(github.com/lee-lou2)Tôi đã lặp đi lặp lại việc tạo rồi cải tiến dự án URL Shortener, rồi lại tạo, lại cải tiến... và cuối cùng cũng làm ra được dự án mã nguồn mở v9 hoàn chỉnh nhất.
🚀 Github : https://github.com/lee-lou2/rust-url-shortener
Trong quá trình chuẩn bị dự án, tôi đã cố gắng nhất định tuân thủ các yêu cầu dưới đây.
Yêu cầu
- Short URL phải được tạo ra cực kỳ nhanh
- Không được chậm đi chỉ vì lượng dữ liệu tăng lên
- Dù ở bất kỳ thời điểm, tình huống nào, với dữ liệu nào để gửi yêu cầu thì vẫn phải nhanh
- Khi chuyển từ Short URL sang Original URL cũng phải nhanh
- Thật ra điều này là quá hiển nhiên rồi... 😅
- Cần có các tính năng bổ sung để đáp ứng nhiều nhóm người dùng khác nhau
- Nếu muốn thì phải có khả năng chuyển hướng sang URL khác nhau theo từng nền tảng
- Nếu muốn thì người dùng phải có thể kiểm tra dữ liệu truy cập đi vào URL do họ tạo
Để đáp ứng các yêu cầu này, tôi đã phát triển như sau.
Các điểm đã áp dụng
Q. Làm thế nào để tạo Short Key nhanh mà không phụ thuộc vào lượng dữ liệu?
A.
Thông thường có nhiều cách để tạo Short Key.
Cách thứ nhất là tạo một giá trị ngẫu nhiên, kiểm tra xem nó đã tồn tại trong cơ sở dữ liệu chưa, nếu chưa thì dùng luôn giá trị đó. Nhưng trong trường hợp này sẽ có sự bất tiện là phải kiểm tra trong cơ sở dữ liệu và có thể phải tạo lại thêm một lần nữa. Ngoài ra, khi đã có rất nhiều dữ liệu hoặc đến thời điểm phải thay đổi số ký tự của Short Key, độ trễ lớn có thể phát sinh.
Cách thứ hai là tạo sẵn các Short Key ngẫu nhiên rồi ánh xạ chúng. Cách này chỉ cần gán một Short Key đã tạo sẵn nên luôn có thể tạo Short URL rất nhanh. Tuy nhiên, đây cũng không thể là đáp án cuối cùng. Việc tạo sẵn có thể có giới hạn, và nếu số lượng Short URL được tạo ra vượt quá phần đã chuẩn bị trước thì sẽ phát sinh thêm các yếu tố cần cân nhắc.
Vậy có phương pháp nào tốt hơn nữa không?
Sau rất nhiều suy nghĩ, tôi đã áp dụng cách sau: kết hợp chuỗi ngẫu nhiên 4 ký tự với chuỗi được tạo từ PK. Vui lòng tham khảo phần bên dưới để xem giải thích cho từng giá trị. Trình tự như sau. Khi người dùng yêu cầu tạo Short URL, hệ thống tạo một chuỗi ngẫu nhiên 4 ký tự và lưu nguyên trạng vào cơ sở dữ liệu. PK được phát hành trong lúc lưu sẽ được chuyển thành chuỗi theo phương pháp mô tả bên dưới. Sau đó kết hợp chuỗi ngẫu nhiên được tạo ban đầu với chuỗi PK để tạo thành Short Key. Làm như vậy thì dù dữ liệu có tích lũy nhiều đến đâu, việc tạo vẫn nhanh, an toàn và không bị trùng lặp.
- Chuỗi ngẫu nhiên 4 ký tự là gì?
Ở đây, chuỗi ngẫu nhiên 4 ký tự là một chuỗi thật sự ngẫu nhiên gồm chữ cái thường/hoa tiếng Anh và chữ số. Chuỗi này có bị trùng cũng không sao. - Chuyển PK thành chuỗi?
Tiếp theo là chuỗi PK, tức giá trị thứ hai. Giả sử ta tạo chuỗi theo thứ tự bằng cách kết hợp chữ cái thường/hoa tiếng Anh và chữ số. Thứ tự là chữ thường a -> z, chữ hoa A -> Z, rồi số 0 -> 9. Khi đó a sẽ là giá trị đầu tiên được tạo, b là 2, c là 3, ... và cứ thế có thể kết hợp các giá trị theo thứ tự. Khi tạo hết đến 9, có thể tăng số ký tự để tạo aa, ab, ac... Nếu tạo tuần tự như vậy thì sẽ xuất hiện chỉ số tương ứng với chuỗi. Chẳng hạn chỉ số của a sẽ là 1. Từ đây có một cách tiếp cận: chỉ cần để PK đóng vai trò là chỉ số và tìm chuỗi tương ứng với PK đó.
Q. Làm thế nào để tăng tốc khi chuyển từ Short URL sang Original URL?
A.
Điều này được xử lý rất đơn giản bằng cách dùng cache. Có nhiều lựa chọn dịch vụ khác nhau, nhưng trong dự án trên tôi đã áp dụng memory cache để có thể truy vấn dữ liệu nhanh hơn. Ngoài ra, các tính năng phụ ngoài việc chỉ truy vấn dữ liệu và chuyển hướng được xử lý bằng cách tạo lightweight thread.
Q. Bạn đã triển khai những tính năng bổ sung nào?
A.
Trước hết, tôi đã triển khai để có thể chuyển hướng sang URL khác nhau theo từng nền tảng. Hệ thống nhận và lưu DeepLink mặc định cho iOS, Android, đồng thời nhận thêm FallbackUrl để phòng trường hợp không thể chuyển đến DeepLink. Ngoài ra còn nhận cả URL dùng khi truy cập từ desktop để bao phủ mọi trường hợp.
Thứ hai, tại thời điểm chuyển sang Original URL, tôi đã thêm tính năng nhận webhook URL để mỗi khi việc chuyển hướng sang Original URL diễn ra, webhook URL sẽ được gọi, nhờ đó người dùng có thể kiểm tra log truy cập. Hiện tại, hệ thống được triển khai để chỉ truyền User Agent và thông tin Short URL.
Thứ ba, khi tạo Short URL, tôi cho phép nhập thêm thông tin của thẻ Head. Mục đích của việc bổ sung này là để tùy biến thẻ og. Nếu không nhập các thẻ đó, hệ thống sẽ lưu thông tin head của Default URL.
Dự án này được phát triển bằng Rust. Thật ra tôi mới học Rust được 2 tháng. Ban đầu tôi phát triển dự án URL Shortener bằng FastAPI, sau đó cũng từng làm bằng Golang. Rồi khi học Rust, tôi bị cuốn hút rất mạnh bởi ngôn ngữ này nên đã làm lại một lần nữa dự án URL Shortener được nâng cấp toàn diện.
Vì hiện tại tôi vẫn chưa thật sự quen với cú pháp, ownership, lifetime... nên có thể mã nguồn vẫn còn những điểm chưa tốt. Rất mong nhận được sự quan tâm, ủng hộ và phản hồi từ mọi người 🙏
Cảm ơn bạn đã đọc đến cuối
17 bình luận
Mình cũng đã đăng các dự án khác, mong mọi người quan tâm nhiều hơn 🎉
https://vi.news.hada.io/topic?id=18647
Đây là một dự án rất tuyệt vời.
Nếu Docker được hỗ trợ như bạn đã viết thì sẽ thật tuyệt!
Cảm ơn bạn 👏 Tôi sẽ bổ sung Docker trong tuần này rồi đăng lên nhé 🙇♂️
Không biết việc nhập email có bắt buộc không nhỉ? Tôi đã không biết rằng nếu chưa xác thực email thì sẽ không thể dùng webhook hoặc tạo địa chỉ.
Nếu bạn chỉ dùng nội bộ và cần tùy biến, tôi sẽ hỗ trợ tùy biến riêng tách biệt với dự án đó!
Vâng, để sử dụng như một dịch vụ công khai, tôi đã áp dụng việc bắt buộc nhận email (dùng xác thực email mà không cần đăng ký thành viên)
Tôi cũng sẽ thử cân nhắc một phương án chỉnh sửa để khi nhập JWT thì không cần có email 🙏
Tôi đang cài Ubuntu trên Lightsail và làm theo thử, nhưng có khá nhiều thứ cần phải cài như SSL,
pkg-config, sqlite, cargo :) Tôi định dùng Cloudflare Tunnel cho phần https này thay vì NPM, nhưng đúng là vẫn thấy khó với tôi quá huhu.. Tôi sẽ chờ bản Docker! Vừa hay dynamic link cũng đã bị khai tử nên tôi đang băn khoăn, cái này thật sự quá tuyệt.Đã thêm
Dockerfilevà lệnh có thể chạy (deploy.sh) 🎉Tôi sẽ thêm Docker sớm nhất có thể haha
Ồ nhưng tôi vẫn đã chạy được! Mà làm thế nào nhỉ? Hơ?
Mình nghĩ sẽ tốt hơn nếu thêm URL demo không chỉ trong
READMEcủa repo GitHub mà cả trên website nữa!Thường thì mình hay xem phần thông tin ở bên phải của repo trước để kiểm tra xem có trang chủ hay playground hay không, nên lúc đầu mình đã tưởng là không có trang demo haha
Mình đã xem dự án rất vui, đây là một dự án rất hay!
Ôi, mình đã bỏ lỡ mất rồi, phải cài đặt ngay mới được. Cảm ơn nhé 🤩
Đúng là một dự án cho thấy sự chăm chút!
Bên mình cũng đang tự làm một thứ tương tự để dùng trong công ty, nhưng trong trường hợp của mình thì vì phải được đưa lên ấn phẩm in nên mình đã thiết lập bộ ký tự để tránh các ký tự dễ gây nhầm lẫn.
Nội dung liên quan hình như cũng có trên GeekNews.
https://vi.news.hada.io/topic?id=14479
Hay quá!! Khi tạo id hoặc tạo link, nếu cân nhắc cả phần đó thì sẽ ổn hơn thật.
Wow, cảm ơn nhé 👍
Chỉ cần cài đặt Rust và thiết lập biến môi trường là có thể dùng ngay!
Dịch vụ URL của Google sẽ ngừng hoạt động trong năm nay, hãy dùng đây như một giải pháp thay thế. Mọi email với câu hỏi, điểm cần cải thiện, cách cài đặt và các nội dung khác đều được chào đón 👏
Bạn có thể dùng thử đơn giản tại https://f-it.kr/ 🙇♂️