Pregunta

La aplicación web Java que estoy desarrollando permite a los usuarios cargar archivos (imágenes y documentos) a sus perfiles y definir reglas de acceso para esos archivos (defina cuál de los otros usuarios puede ver / descargar el archivo). El sistema de control / permiso de acceso está hecho a medida y las reglas se almacenan en MongoDB junto con el perfil del usuario y la entrada real del archivo.

Sabiendo que necesito que la aplicación y el almacenamiento se distribuyan y sean tolerantes a fallas, necesito averiguar cuál es la mejor estrategia para el almacenamiento de archivos.

¿Debo almacenar los archivos dentro de MongoDB en la colección de archivos donde se encuentran el documento del archivo que contiene descripción y reglas de acceso?

¿O debo almacenar los archivos dentro del sistema de archivos del servidor y mantener la ruta en el documento MongoDB? Con el enfoque del sistema de archivos, ¿podré aplicar los permisos de acceso definidos por el usuario y cómo? Finalmente, en el enfoque del sistema de archivos, ¿cómo distribuyo los archivos de los servidores ACCROSS? ¿Debo usar servidores dedicados para esto o puedo almacenar los archivos en los servidores WebApp o los servidores MongoDB?

¡Muchas gracias por todas tus ideas! Cualquier ayuda o retroalimentación apreciado.

Alex

¿Fue útil?

Solución

Hay varias alternativas:

  • poner archivos en un servicio de almacenamiento (por ejemplo, S3): fácil y mucho espacio pero mal perfil
  • poner archivos en un sistema de archivos local: rápido pero no escala
  • poner archivos en documentos de MongoDB: fácil, potente y escalable pero limitado a 16 MB
  • Use la capa Gridfs de MongoDB. Las funcionalidades son limitadas, pero está hecha para la escalabilidad (gracias al fragmento) y también es bastante rápido. Tenga en cuenta que puede poner información sobre el archivo (permiso, etc.) directamente en el objeto de metadatos del archivo.

En su caso, parece que la última opción puede ser la mejor, hay bastantes usuarios que cambiaron de FS a Gridfs y funcionó muy bien para ellos. Cosas a tener en cuenta:

  • GRIDFS Fragmento funciona pero no es perfecto: por lo general, solo los datos son fragmentados, no los metadatos. No es un gran problema, pero el fragmento con metadatos debe ser muy seguro.
  • Puede ser beneficioso usar GridFS en un clúster MongoDB separado de sus datos principales, ya que los requisitos (almacenamiento, copia de seguridad, etc.) son generalmente diferentes.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top