Question

Je souhaite exécuter des algos de traitement d'image sur le serveur pouvant interagir facilement avec des applications Web.Les algos de traitement d'images sont calculées lourdes et ne seront pas disponibles dans des bibliothèques personnalisées.Actuellement, j'utilise Ruby sur Rails sur Heroku pour mon site Web.

Quelle serait la meilleure architecture pour y parvenir?Prenez des images du site Web - Exécutez l'image Traitement de l'image Algo dessus - Displayez sur le site Web

La plupart de mon code de traitement d'image se trouve sur C / C ++.

Puis-je appeler C / C ++ code de Ruby sur Rails directement?Est-ce possible sur Heroku?

ou dois-je concevoir un système sur lequel C / C ++ Code expose certaines API qui peuvent être appelées par Ruby sur Rails Server?

Était-ce utile?

La solution

Heroku utilise généralement de petites instances de la machine virtuelle, donc en fonction de la taille de votre traitement, ce n'est peut-être pas le meilleur choix d'architecture. Cependant, si vous l'utilisez, je ferais ceci:

Utilisez un gemme de travail d'arrière-plan pour faire votre traitement. Demandez à cela sur un processus distinct (appelé travailleur plutôt qu'un dyno dans la terminologie de Heroku). Le travail différé est une solution éprouvée pour les tâches de base avec une multitude d'informations en ligne concernant l'intégration de Heroku, mais il y a des plus récents comme Sidekiq, qui utilisent le nouveau système de threading dans des versions modernes de Ruby. Ils permettraient à tout de se faire dans le Dyno, mais je dirais qu'il serait utile de garder tout le traitement de l'arrière-plan loin du serveur Web Dynos, un travail aussi retardé (ou similaire) irait bien.

Quant à l'intégration de C / C ++, je n'ai pas encore besoin de le faire comme ça. Cependant, je sais qu'il est possible de créer des gemmes qui intègrent le code C ou C ++ et compiler de manière nativement. Tant que vous utilisez Ruby plutôt que Jruby, je ne pense pas que Heroku devrait avoir un problème avec eux. Il existe d'autres moyens d'accomplir cela, examinez des questions spécifiquement sur ce sujet, telles que

Comment puis-je appeller des fonctions C ++ à partir de rubis

Il semble que vous ayez besoin de créer une extension, puis créez un gemme pour la contenir. Ces liens peuvent ou non aider.

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/

Je recommande de faire un gemme car je pense qu'il peut être difficile d'obtenir des bibliothèques ou des exécutables sur une instance Heroku. Vous pouvez stocker le gemme dans votre répertoire de fournisseur si vous ne voulez pas le rendre public.

Globalement, j'aurais le serveur Web Téléchargez sur S3 ou où vous stockez les images (ceci peut être effectué directement dans le navigateur sans utiliser le serveur Web comme tremplin avec l'AWS JS API. Jetez un coup d'œil à des gemmes pour aider .)

Ensuite, le serveur Web peut demander une tâche d'arrière-plan pour traiter l'image.

Si vous ne les stockez pas, les choses deviennent un peu plus intéressantes ... vous aurez besoin d'une base de données si vous utilisez des tâches d'arrière-plan, vous pouvez donc transmettre les données d'image au travailleur comme une blob dans le la base de données peut-être.

Je ne ferais vraiment pas tout le traitement juste dans le serveur Web Dyno, à moins que vous ne puissiez vraiment frapper cette chose de temps en temps. Avec plusieurs utilisateurs, vous frapperiez très rapidement un goulot d'étranglement.

Le processus d'arrière-plan peut définir un drapeau de la ligne de table d'image afin que le serveur Web puisse permettre à l'utilisateur de savoir lors du traitement terminé. (Vous pouvez sonder des informations sur JS sur l'écran de téléchargement complet à l'aide d'Ajax)

Bien sûr, il existe de nombreuses autres manières de l'accomplir, en fonction d'un certain nombre de facteurs.

excuses que la réponse est vague, mais la question est assez ouverte.

bonne chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top