¿Cuál sería la arquitectura y el diseño correctos para un proyecto que utiliza openCV y Python?

Aquí hay una posible arquitectura basada en Amazon AWS.

Puede tener el backend NoSQL (DynamoDB), pero solo si realiza un seguimiento de los perfiles de usuario y les vincula imágenes cargadas. Almacene solo metadatos (ubicaciones de archivos) en la base de datos. Es mejor almacenar blobs / imágenes en S3.

Para procesar imágenes:

  1. Crear subred con una flota de instancias EC2
  2. Escriba el script Python / OpenCV para procesar sus imágenes. Libérelo a cada uno de los nodos EC2. (Alternativamente, suéltelo con Beanstalk Docker)
  3. Crear cola SQS (Servicio de cola simple) “Primer paso”
  4. Escriba la función Lambda que se llamará al cargar la imagen del usuario (desde el navegador web). Se escribirá la ubicación de la imagen S3 en la cola SQS “Primer paso”.
  5. Haga que los nodos EC2 (o el contenedor Docker) extraigan la cola de Amazon SQS “Primer paso” para recibir nuevos mensajes y procesarlos utilizando el código Python que escribió. Escriba los resultados del procesamiento de imágenes de OpenCV en el depósito S3 “hecho”.
  6. Escriba un mensaje en una nueva cola SQS “Segundo paso” con la ubicación del archivo procesado en S3.
  7. Haga que su código de Deep Learning escuche esta nueva cola SQS “Segundo paso”. Leer ubicación del archivo. Comience su próximo paso de procesamiento

Tenga en cuenta que:

  • Si usa contenedores Docker para ejecutar su código Python, no necesita la flota EC2.
  • Si eligió EC2, puede ahorrar utilizando instancias bajo demanda, reservadas o puntuales. Spot es la mejor opción para ti.
  • Autoescala con AWS AutoScaling.
  • Código de versión con AWS Elastic Beanstalk Docker

Tengo una situación similar; conjuntos de scripts Python de varios grupos que necesitan comunicarse y finalmente enviar datos a una base de datos MongoDB.

Los conecté con un sistema de corredores de mensajería, RabbitMQ. Proporciona flexibilidad y escalabilidad, y es fácil de configurar. Los scripts envían objetos JSON entre sí.

Esta es una arquitectura simple, pero me ha funcionado bien.