¿Qué paquete tecnológico utilizarías para crear una aplicación web de votación / intercambio de imágenes para organizaciones y por qué?

Desde una perspectiva técnica, hay dos lados del problema: un proyecto web similar a una red social (con usuarios, organizaciones que interactúan con fotos) y luego la plataforma de carga, procesamiento y almacenamiento de imágenes. El primero es complejo en lógica pero fácil en tecnología, el segundo es solo el otro lado.

Depende del conjunto de habilidades de su equipo, cualquier marco web adecuado podría construir el portal web. Con las pilas de Python en mente, Django proporciona un marco básico para usuarios, objetos y sistemas de permisos integrados, podría ser un buen punto de partida. El frasco con algunos complementos (Flask-User, Flask-sqlalchemy, etc.) también funcionaría bien. Un diagrama ER adecuado realmente ayudaría al proceso de diseño antes de acceder a las páginas vistas.

Entonces esa es la plataforma de imagen.

  • La carga de imágenes de 500M generalmente excedería la capacidad habitual del navegador y requiere alguna forma de carga de complementos o integración con el servicio FTP.
  • Las imágenes deben ser procesadas: redimensionadas para diferentes propósitos (miniatura, vista previa rápida, etc.) que requiere mucha CPU. Generalmente requiere una cola de trabajos (Celery, por ejemplo), un clúster / granja de procesamiento con un almacenamiento compartido (S3 es una solución popular para los usuarios de AWS)
  • Almacenamiento escalonado. Las miniaturas se solicitan con la frecuencia más alta, por lo que requiere almacenamiento en caché y distribución rápida: CDN sería la frontera, entonces escuché a personas que usan MongoDB GFS para esta tarea. No se debe acceder / descargar los originales con mucha frecuencia, por lo tanto, se pueden colocar en algunos lugares secundarios y más lentos para ahorrar costos.

Y puede haber otro “sistema de back-end” (quizás conectado) para proporcionar a los usuarios el progreso de la carga / procesamiento y permitir a los administradores monitorear el contenido en busca de usos inapropiados.

Poner todo junto, con mi fondo de Python en mente:
Infraestructura:

  • Linux, por supuesto.
  • Algunas máquinas requieren CPU alta (procesadores de imagen) y otras requieren E / S (nodos de almacenamiento primario)
  • Alguna plataforma escalable IaaS (EC2, por ejemplo) para procesar servicios de granja, primario (almacenamiento de instancia EC2) / almacenamiento secundario (S3) y una CDN
  • Soluciones de monitoreo interno que aseguran que todas las partes (servidor web, aplicaciones Python, Redis, DB, Mongo, cola de trabajos, procesadores de imágenes …) funcionen correctamente. Usé supervisor para Python y db y algunas personas prefieren Nagios / Monit para monitorear y alarmar con otra forma de controles de servicio.

Para la web:

  • Cualquier marco apropiado (Django / Flask / etc). Según la complejidad de las lógicas comerciales, la oferta inicial del marco puede ayudar más en las etapas iniciales, pero después de algún punto, todas son similares.
  • Base de datos SQL para web
  • Almacenamiento para acceso rápido a imágenes: soluciones autohospedadas basadas en MongoDB u otras soluciones, o simplemente use S3
  • CDN
  • Caché interno (Redis) / servidores web (Nginx)

Para el backend de la imagen:

  • ¿Subir aplicación / complemento / integración FTP?
  • Cola de trabajo: Apio / Gearman / etc.
  • Instalaciones de procesamiento de imágenes: ImageMagick u otras herramientas con alto rendimiento. Scripts que impulsan estas herramientas y se integran con el resto del sistema.

Este sería un proyecto bastante grande. Con algunos servicios externos (S3, por ejemplo), algunas tareas podrían ser más fáciles que antes, pero aún es de naturaleza compleja.

No estoy muy familiarizado con GAE y no estaría seguro si GAE es más rentable y / o flexible que mi solución interna.

yo recomendaria

Front End – Angular JS [Desarrollo de interfaz de usuario más rápido]
Back End – Java [Spring Framework] para servicios web, implementación de permisos con Spring Security, Hibernate Framework [para transacciones db]
Base de datos – PostgreSQL [Código abierto, escalable]
Almacenamiento de imágenes – Amazon S3
Marco de almacenamiento en caché – Memcache
Implemente su solución en el servidor Apache Tomcat en una instancia de Amazon

Apilar:
Cualquier marco PHP que le guste para el sitio.
Marco delgado (API REST)
H HVM
Nginx
Tal vez barniz o HAProxy para balanceo de carga
Riak (Almacén de datos escalable)
Redis (almacenamiento en caché)
RabbitMQ para colas de trabajo

La idea es que todos los niveles se pueden escalar individualmente para que la aplicación esté preparada para el futuro.

El almacenamiento de imágenes (1000 organizaciones entre 10 y 500 MB) sería de 10-500 GB, esto sugeriría un backend de almacenamiento de objetos, tal vez algo como ceph o openstack swift si es interno o S3, archivos de nube u objetos de sueño si es externo, pero el almacenamiento también podría ser proporcionado por un par de servidores con DRBD y GFS ya que 500Gig todavía es bastante pequeño.

Es tarde, así que me detendré aquí, pero si quieres una aclaración, solo pregunta.

Adicional:
50 Principios para escalar sitios web eBook: Martin L. Abbott, Michael T. Fisher: Amazon.co.uk: Kindle Store: este es un gran libro si necesita comprender cómo escalar una arquitectura.

Lo que ha sugerido no es una gran aplicación SaaS. En comparación con muchos con los que he trabajado, en realidad es bastante pequeño y, sinceramente, podría hacerse con una pila LAMP bastante básica con la adición de Gearman o RabbitMQ para trabajos asíncronos.

Si tienes experiencia con LAMP, primero ve por esta ruta. Hará que tu MVP sea mucho más fácil.

La pila sigue:

Para Backend: usaré mysql si sus usuarios necesitan registrarse y almacenar otra información que pueda ser permanente, los votos, los me gusta se pueden almacenar fácilmente en mysql db.
si necesita un marco db, entonces sql alchemy podría ser útil para usted.

Para los metadatos: utilizaré Redis, ya que estos guardan cosas en la memoria para que los metadatos rápidos se puedan servir muy rápidamente. Como imagen desc, metadatos de imagen.

Para API: usaré Tornado python porque puedo escalarlo a millones de solicitudes / segundo y más. Desde entonces, también proporciona funcionalidad para hacer las cosas de forma asíncrona para que las cosas se vuelvan más fáciles.

Almacenamiento de imágenes: estaba usando S3 para imágenes. subir imágenes a s3 y mantener un mapa en sql o redis o mongo. porque no quieres arriesgarte con choques y otras cosas. También puede dar permisos para descargar imágenes directamente al usuario desde ses. puede escribir fácilmente una api que pueda escalar sus imágenes de acuerdo con sus especificaciones y mantenerlas en db.

front-end: para un desarrollo rápido, puede usar el programa de arranque de Twitter junto con JS, que puede funcionar bastante bien para varios tamaños de navegador y res.

Creo que debería ser suficiente para que comiences.

Como nunca antes había tratado con imágenes en un entorno de producción, ni siquiera sabría por dónde empezar. Pero yo era A2Aed, así que te recomiendo que comiences leyendo http://imgur.com/blog/2013/06/04 … y luego continúes leyendo más sobre cualquier tecnología que encuentres en la publicación de blog anterior que ‘ no te das cuenta.

No tengo experiencia con proyectos tan serios como eso, pero en este momento pienso en Node.js, MongoDB y jQuery.
De manera tradicional, PHP con un marco relativo y MySql es la solución.