Chúng tôi lưu trữ hình ảnh ở đâu?
Giải pháp số 1 trong MongoDB
Vì vậy, giải pháp đầu tiên là lưu trữ các hình ảnh bên trong MongoDB. Nó có thể chứa các tệp hình ảnh hoặc bất kỳ loại tệp nào. Vì vậy, bạn có thể lấy một tệp và gắn nó vào một bản ghi bên trong MongoDB và lưu trực tiếp vào cơ sở dữ liệu của bạn.
Với cách tiếp cận này, việc gắn trang mô tả của một mặt hàng quần áo cụ thể với hình ảnh tương ứng trở nên dễ dàng vì bạn có thể nhúng hình ảnh này trực tiếp vào quá trình phát triển trang đó và khách hàng của bạn sẽ hài lòng với cách tiếp cận đó vì khi người dùng truy xuất mô tả chi tiết trang của bài báo về quần áo, nó đi kèm với hình ảnh.
Vì vậy, đó là một giải pháp khả thi, chỉ cần lấy hình ảnh và lưu trữ trực tiếp vào MongoDB.
Tuy nhiên, tôi sẽ gợi ý rằng đây là một cách tiếp cận tồi. Lý do cho điều đó, bạn có thể cho khách hàng của mình biết nếu có phản hồi là họ thường sẽ trả tiền cho phiên bản Mongo của họ về dung lượng lưu trữ mà bản sao Mongo của họ sử dụng.
Vì vậy, khi sử dụng hết bộ nhớ, họ phải trả nhiều tiền hơn mỗi tháng.
Ví dụ:lần cuối cùng tôi kiểm tra việc sử dụng MLab, họ đang tính phí $ 15 cho mỗi GB. Vì vậy, đó là $ 15 từ túi khách hàng của bạn để lưu trữ hình ảnh trị giá 1GB.
Đối với một trang web thương mại điện tử khác, chúng ta đang nói về 3GB dễ dàng chuyển thành 330 hình ảnh nhiều hơn hoặc ít hơn, tương đương 15 đô la một tháng.
Vì vậy, nếu một trong những người quản lý dự án của họ tải lên một bài báo mới về quần áo mỗi ngày một lần, chúng ta đang nói về một chi phí rất lớn rất nhanh chóng.
Vì vậy, cá nhân tôi nghĩ rằng việc lưu trữ bất kỳ loại tệp nào trực tiếp bên trong MongoDB thực sự không phải là một lựa chọn vì nó sẽ rất tốn kém.
Vì vậy, đó chỉ là một giải pháp khả thi.
Giải pháp số 2 ở chế độ HD được đính kèm với máy chủ
Vì vậy, chúng ta hãy xem xét một giải pháp thứ hai có thể có sẵn cho bạn. Bạn có thể sử dụng ổ cứng được kết nối với máy chủ Express của mình. Vì vậy, khi ứng dụng này được triển khai trên một số môi trường đám mây như Heroku, Digital Ocean, Linode hoặc AWS, bạn thường nhận được một ổ cứng được liên kết với ứng dụng của mình.
Vì vậy, có thể bạn chụp ảnh và đặt chúng bên trong ổ cứng cục bộ. Cách tiếp cận này là điều mà phần lớn các bài đăng và bài viết trực tuyến sẽ ủng hộ:
Cách thực hiện để tải lên, hiển thị và lưu hình ảnh bằng node.js và express
https://appdividend. com / 2019/02/14 / node-express-image-upload-and-resize-tutorial-example /
https://medium.com/@nitinpatel_20236/image-upload -via-nodejs-server-3fe7d3faa642
Chỉ với ba điều tôi đã tập hợp ở trên, bạn đã có một bản thiết kế khá mạnh mẽ để bắt đầu.
Mỗi người đều nói rằng hãy lấy tệp và lưu vào ổ cứng cục bộ của bạn. Trong bài viết cụ thể này:
https://alligator.io/nodejs/uploading-files-multer-express/
họ đang hiển thị mã này:
const storage = multer.diskStorage({
destination: 'some-destination',
filename: function (req, file, callback) {
//..
}
});
Họ đang sử dụng thư viện tải lên hình ảnh có tên multer
cung cấp diskStorage()
công cụ tải hình ảnh lên đĩa.
Vì vậy, đây là một cách tiếp cận mà cộng đồng phát triển nói chung đồng ý với.
Đây là một cách tiếp cận tốt trong bối cảnh ánh xạ một-một.
Các vấn đề với cách tiếp cận này bắt đầu nảy sinh khi chúng ta có nhiều máy.
Ví dụ về điều này là nếu bạn có nhiều máy được lưu trữ trên Digital Ocean hoặc Linode trong đó mỗi môi trường là một phiên bản riêng biệt.
Nếu bạn có tất cả hình ảnh của mình được lưu trữ trong ổ cứng đi kèm và sau đó bạn bắt đầu mở rộng quy mô máy chủ của mình, chúng sẽ có ổ cứng riêng.
Vì vậy, bạn có thể có một yêu cầu đến thông qua bộ cân bằng tải và bộ cân bằng tải quyết định nơi gửi yêu cầu như sơ đồ bên dưới:
Vì vậy, vấn đề với kiến trúc trên là nếu hình ảnh được lưu vào một trong hai ổ cứng và sau đó có yêu cầu truy cập vào cùng hình ảnh đó, nhưng hãy tưởng tượng yêu cầu được chuyển đến máy chủ Express khác bằng ổ cứng khác. nơi hình ảnh không tồn tại.
Đây là sự cố xuất hiện khi bạn bắt đầu sử dụng nhà cung cấp dịch vụ như Linode hoặc Digital Ocean, nơi bạn có ánh xạ 1-1 giữa máy chủ và ổ cứng.
Đó là một giải pháp ngắn hạn nếu đó là tất cả những gì bạn cần lúc này, nhưng một khi ứng dụng đó bắt đầu mở rộng quy mô thì đó sẽ là một vấn đề.
Giải pháp số 3 bên ngoài kho dữ liệu
Giải pháp thứ ba này là giải pháp mà tôi đã sử dụng trong quá khứ với các ứng dụng React with Node và cả ứng dụng Ruby on Rails. Trên thực tế, trang web danh mục đầu tư Ruby on Rails của tôi sử dụng giải pháp này và nó nằm trên nền tảng Heroku.
Vì vậy, khi hình ảnh được tải lên, thay vì API Express cố gắng lưu trữ tệp cục bộ như trên ổ cứng của chính nó, nó sẽ lấy hình ảnh và sử dụng kho dữ liệu bên ngoài để lưu giữ tất cả các hình ảnh khác nhau từ ứng dụng.
Cái mà tôi sử dụng cho trang web danh mục đầu tư của mình và cái mà tôi đã sử dụng cho các ứng dụng Node với React là Amazon S3, nhưng cũng có Azure File Storage và Google Cloud Storage. Các hệ thống này được tạo ra để chứa một lượng lớn dữ liệu và chúng có thể là bất kỳ loại tệp nào mà bạn có thể tưởng tượng được. Không chỉ hình ảnh chẳng hạn như trong trường hợp của bạn, mà còn các tệp video, tệp âm thanh, vân vân.
Không có giới hạn về dung lượng lưu trữ bạn có thể có với S3, nhưng bạn không cần phải sử dụng S3, nhưng nó được coi là tiêu chuẩn ngành ngay bây giờ, nhưng bạn có thể dễ dàng sử dụng Azure và Google Cloud.
Lợi ích của giải pháp này mà tôi nghĩ rằng khách hàng của bạn sẽ đánh giá cao, Amazon S3 tính phí bạn như hai xu cho mỗi gigabyte mỗi tháng để lưu trữ.