Pregunta

Quiero ejecutar imágenes procesando algos en el servidor que puede interactuar fácilmente con las aplicaciones web.Los algos de procesamiento de imágenes son calcular pesados y no estarán disponibles en bibliotecas de construcción personalizada.Actualmente estoy usando Ruby en rieles en Heroku para mi sitio web.

¿Cuál sería la mejor arquitectura para lograr esto?Tome imágenes del sitio web: ejecute la imagen Procesando Algo en él: visualización de la imagen en el sitio web

La mayor parte de mi código de procesamiento de imágenes está en C / C ++.

¿Puedo llamar al código C / C ++ de Ruby On Rails directamente?¿Es esto posible en Heroku?

¿O debería diseñar un sistema donde el código C / C ++ expone algunas APIs que pueden ser llamadas por Ruby On Rails Server?

¿Fue útil?

Solución

Heroku típicamente utiliza instancias pequeñas de máquinas virtuales, por lo que dependiendo de cuán pesado es su procesamiento, puede que no sea la mejor opción de arquitectura. Sin embargo, si lo usa, haría esto:

Use una gema de tareas de fondo para realizar su procesamiento. Haga que esto se ejecute en un proceso separado (llamado un trabajador en lugar de un dinómetro en la terminología de Heroku). El trabajo retrasado es una solución probada y probada para tareas de fondo con una gran cantidad de información en línea relacionada con la integración en Heroku, pero hay más nuevos como Sidekiq que usa el nuevo sistema de roscado en las versiones modernas de Ruby. Permitiría que todo se haga en el Dyno, pero diría que sería útil mantener todo el procesamiento de antecedentes alejado de los Dynos de servidores web, por lo que el trabajo retrasado (o similar) estaría bien.

En cuanto a la integración de C / C ++, todavía no necesito hacer esto. Sin embargo, sé que es posible crear gemas que integren el código C o C ++ y compilen de forma nativa. Mientras esté usando Ruby en lugar de jruby, no creo que Heroku tenga un problema con ellos. Hay otras formas de lograr esto, observan las preguntas específicamente sobre este tema, como

¿Cómo puedo llamar a las funciones de C ++ desde Ruby

Parece que necesita crear una extensión, luego cree una gema para contenerla. Estos enlaces pueden o no pueden ayudar.

http://www.rubyinside.com/how-to-create-a-ruby-extension-in-c-in-under-5-minutes-100.html

http://guides.rubygems.org/gems-with-extensions/

Recomiendo hacer una joya como creo que puede ser difícil obtener de otra manera obtener bibliotecas o ejecutables a una instancia de Heroku. Puede almacenar la gema en su directorio de proveedores si no quiere hacerlo público.

En general, tendría la carga del servidor web a S3 o donde sea que esté almacenando las imágenes (esto se puede hacer directamente en el navegador sin usar el servidor web como un escalón con la API de AWS JS. Echa un vistazo a las gemas para ayudar .)

Luego, el servidor web puede solicitar una tarea de antecedentes para procesar la imagen.

Si no los está almacenando, las cosas se vuelven un poco más interesantes ... Necesitará una base de datos si está utilizando tareas de fondo, para que pueda pasar los datos de la imagen al trabajador como un blob en el base de datos tal vez.

Realmente no haría todo el procesamiento justo en el WebServer Dyno, a menos que realmente estés golpeando esta cosa muy ocasionalmente. Con varios usuarios que golpearía un cuello de botella muy rápidamente.

El proceso de fondo puede establecer una bandera en la fila de la tabla de imágenes para que el servidor web pueda informar al usuario cuando se complete el procesamiento. (Puede encuestarse para obtener información utilizando JS en la pantalla completa de carga usando AJAX)

Por supuesto, hay muchas otras formas de lograr esto, dependiendo de una serie de factores.

Disculpas de que la respuesta es vaga, pero la pregunta es bastante abierta.

buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top