Hành Trình 18 Tháng Xây Dựng Ứng Dụng SaaS
Giới thiệu
10.000+ ảnh. Hàng trăm video. Một kỷ niệm cụ thể mà tôi rất cần tìm.
Có bao giờ bạn cảm thấy như thế không? Trong bài viết này, tôi sẽ chia sẻ về hành trình 18 tháng xây dựng ứng dụng SaaS mang tên RekoSearch, một công cụ giúp tìm kiếm nội dung đa phương tiện một cách thông minh và hiệu quả.
💡 Mẹo: Bỏ qua phần giải thích
Nếu bạn muốn thử nghiệm ngay, hãy tham gia vào RekoSearch Closed Beta hoặc khám phá kiến trúc và công nghệ của chúng tôi trong bài viết này.
Khi việc lưu trữ kỹ thuật số trở thành vấn đề thực sự
Khoảng một năm rưỡi trước, tôi đang tìm kiếm dự án lớn tiếp theo. Trong khi cố gắng lọc qua hàng ngàn phương tiện để tìm một số bức ảnh và video cụ thể, tôi đã gặp phải một vấn đề lớn: tôi có hơn 10.000 ảnh và video, được tổ chức theo năm và theo khoảng thời gian, nhưng vẫn có hàng trăm tệp trong mỗi thư mục. Việc tìm kiếm nội dung chính xác mất rất nhiều thời gian.
Mặc dù có nhiều công cụ cho phép tìm kiếm nội dung qua khuôn mặt hoặc từ khóa, nhưng chúng không đáp ứng đủ yêu cầu về khả năng tìm kiếm sâu, phạm vi rộng hoặc chỉ phù hợp với một số trường hợp sử dụng nhất định.
RekoSearch: Tìm kiếm ngữ nghĩa trên tất cả nội dung của bạn
RekoSearch cho phép bạn tìm kiếm đồng thời trên ảnh, video, tài liệu và tệp âm thanh với các truy vấn ngôn ngữ tự nhiên.
Tính năng nổi bật
- 🔍 Tìm kiếm bằng ngôn ngữ tự nhiên: Sử dụng các cụm từ như 'chó và núi' để tìm tất cả ảnh và video có chó và núi.
- 📁 Hỗ trợ đa định dạng: Tìm kiếm trên ảnh, video, tài liệu và tệp âm thanh đồng thời.
- ⚡ Truy vấn nâng cao: Sử dụng toán tử Boolean và bộ lọc để có kết quả chính xác với logic tìm kiếm phức tạp.
Ví dụ, nếu bạn đang tìm kiếm điều đơn giản như "chó và núi", bạn sẽ nhận được tất cả ảnh và video có hình ảnh của chó và núi. Hoặc nếu bạn muốn tìm kiếm cụm từ "chúc mừng sinh nhật", RekoSearch sẽ trả về tất cả các tệp chứa cụm từ đó hoặc hình ảnh của những người vui vẻ trong bối cảnh sinh nhật.
Nếu bạn có nhu cầu phức tạp hơn, chẳng hạn như bạn đã tạo ra một sản phẩm mới như ghế sofa và quay một video quảng cáo cho nó, bạn có thể muốn tìm tất cả các cảnh quay liên quan đến sản phẩm, tên thương hiệu và người trong video không có vẻ buồn. Trong trường hợp này, bạn có thể thực hiện một truy vấn tìm kiếm nâng cao như sau:
label:couch AND text:"tên thương hiệu" NOT face:sad
Ngoài ra, RekoSearch còn có các chức năng như lọc, lưu tìm kiếm, tải xuống kết quả và nhiều tính năng khác đang được lên kế hoạch triển khai.
Tuy nhiên, việc xây dựng điều này lại phức tạp hơn tôi tưởng.
Thách thức kỹ thuật: Tại sao việc này khó khăn
Ban đầu, tôi nghĩ việc xây dựng RekoSearch không quá khó, nhưng tôi nhanh chóng nhận ra rằng nó phức tạp hơn tôi kỳ vọng. Ngay cả việc xác thực và phân quyền cho người dùng cũng là một thách thức lớn đối với tôi, người chưa bao giờ triển khai OAuth 2.0 từ đầu. Nhưng bạn phải đảm bảo rằng mọi thứ đều an toàn khi tiền của người dùng liên quan.
Một thách thức khác là quy mô và độ phức tạp trong việc quản lý tất cả mọi thứ. Bạn có hạ tầng, các phương thức API với từng chương trình riêng (15+ hàm Lambda), máy chủ xử lý backend, và cả giao diện người dùng (Homepage và Dashboard). Mỗi khi bạn muốn thay đổi hoặc thêm tính năng, bạn cần đảm bảo rằng nó tương thích và hoạt động tốt với tất cả các thành phần khác.
Ngoài ra còn nhiều thách thức khác liên quan, chẳng hạn như:
- Khả năng mở rộng: Xử lý nhiều tệp mà không bị chậm trễ, lãng phí tài nguyên và chi phí không cần thiết (giải pháp: lên lịch xử lý công việc trên AWS Fargate).
- Bảo mật: Đảm bảo rằng dữ liệu người dùng được xử lý an toàn, mã hóa và hạn chế quyền truy cập.
- Hiệu suất: Không để tài nguyên bị lãng phí khi xử lý các tệp đơn giản như hình ảnh, do đó xử lý nhiều tệp song song để tiết kiệm thời gian.
- Tối ưu hóa chi phí: Sử dụng các tùy chọn lưu trữ rẻ nhất (ví dụ: sử dụng Digital Ocean thay vì AWS cho cụm Kubernetes) và xây dựng các thành phần hiệu quả hơn (ví dụ: sử dụng hàm Rust Lambda).
- Tích hợp dịch vụ AWS: Học và sử dụng SDK cho từng dịch vụ AWS, mỗi dịch vụ đều có những mẹo và cách xử lý riêng.
- Thách thức triển khai đặc thù: Những vấn đề mà bạn nghĩ rằng đã có người giải quyết, nhưng thực tế lại không có, ví dụ như việc đếm số trang trong tệp PDF một cách đáng tin cậy và nhanh chóng.
Kết hợp tất cả những điều này, từ 3-4 tháng tôi dự kiến phát triển, tôi đã trở thành 1,5 năm và hơn 60.000 dòng mã, và đây chỉ mới là khởi đầu của phiên bản beta.
Công nghệ sử dụng
Tôi không thể giải thích mọi thứ trong một hoặc hai đoạn, vì vậy nếu bạn muốn tìm hiểu sâu hơn, hãy tham khảo kho lưu trữ công khai của chúng tôi, nơi có tài liệu chi tiết và sơ đồ kỹ thuật.
1. Hạ tầng
Tất cả được quản lý bằng Terraform.
- Dịch vụ AWS để quản lý các thứ như đăng nhập (Cognito), cơ sở dữ liệu (DynamoDB), lưu trữ (S3) và xử lý tệp (Rekognition, Textract và Transcribe).
- Cụm Kubernetes trên DigitalOcean để lưu trữ Dashboard, Queue Processor (lắng nghe các công việc được đẩy vào hàng đợi SQS và khởi động ứng dụng xử lý công việc trên AWS Fargate).
2. Backend
Tất cả được lập trình bằng Rust, cho phép thực thi nhanh chóng và an toàn tất cả các dịch vụ backend, cũng như giảm chi phí khi sử dụng AWS Lambda (các hàm Rust được biên dịch trước nhanh hơn và nhẹ hơn).
3. Frontend
Được xây dựng bằng TypeScript và Python, chia thành hai thành phần:
- Trang chủ: một trang web tĩnh Next.js được xuất ra và lưu trữ trên S3, xử lý bất kỳ lượng lưu lượng truy cập nào một cách dễ dàng và với chi phí rất thấp.
- Dashboard: một ứng dụng React SPA được lưu trữ trên cụm Kubernetes bằng Gunicorn (máy chủ WSGI sản xuất) và Flask cho lớp logic nghiệp vụ. Nó có thể được mở rộng khi cần thiết.
✅ Sức mạnh của Rust + ARM64
Đây là sự khác biệt khi phát triển hàm Lambda của bạn bằng Rust và chạy trên ARM:
- Các hàm Lambda Rust thực thi nhanh hơn 10 đến 100 lần so với các hàm dựa trên Python.
- Nếu bạn chi khoảng 100 đô la mỗi tháng cho các hàm Lambda viết bằng Python trên x86, việc chuyển sang arm64 sẽ giảm khoảng 20%, tức còn khoảng 80%. Nếu bạn chuyển sang Rust do tính hiệu quả cao hơn, chi phí sẽ giảm xuống khoảng 15-30 đô la mỗi tháng. Đó là giảm 70-85% chi phí!
Tương lai phía trước
Tôi dự định sẽ tiếp tục làm việc và cải thiện dự án này, vì nó rất gần gũi với trái tim tôi và tôi thực sự thích làm việc với nó. Một số tính năng mà tôi đang chú ý bao gồm:
- Triển khai việc sử dụng dấu ngoặc trong truy vấn tìm kiếm để cho phép viết các truy vấn phức tạp hơn.
- Triển khai hệ thống API keys, cho phép sử dụng API bên ngoài Dashboard.
- Thêm hỗ trợ cho nhiều loại tệp hơn bằng cách chuyển đổi chúng trên máy chủ.
- Thêm danh tính nhà cung cấp xã hội cho đăng nhập (OIDC cho Google, v.v.)
- Triển khai tính năng giống như thư viện để tổ chức các tìm kiếm, tệp, kết hợp nhiều công việc và các tính năng khác để biến nó thành một nền tảng khai thác tri thức hoàn chỉnh.
Tầm nhìn lâu dài của tôi cho RekoSearch gắn liền với tính năng cuối cùng mà tôi đã đề cập. Tôi muốn triển khai nhiều tính năng, bao gồm tổ chức, lọc, kết hợp nhiều nguồn dữ liệu, thêm tích hợp với các nền tảng khác, và nhiều thứ khác để biến nó thành giải pháp toàn diện cho tất cả các nhu cầu khai thác tri thức.
Trải nghiệm RekoSearch
Liên kết nhanh
- Bắt đầu với Closed Beta: 50 tín dụng miễn phí (giá trị 5 đô la) • Hoàn hảo cho việc thử nghiệm với tệp của bạn • Không yêu cầu cam kết
- Kho lưu trữ GitHub: Tài liệu kiến trúc đầy đủ • Sơ đồ kỹ thuật và chi tiết triển khai • Khám phá cách tôi xây dựng nó
- Trang web chính: Tìm hiểu thêm về RekoSearch và khả năng của nó
ℹ️ Muốn kết nối?
- Gửi email cho tôi tại contact@adriancrismaruc.com hoặc sử dụng biểu mẫu liên hệ trên portfolio của tôi.
- Kết nối với tôi trên LinkedIn.
- Hoặc thậm chí gửi tin nhắn cho tôi trên Reddit.