Frage

Ich möchte Bildverarbeitungsalgorithmen auf einem Server ausführen, die problemlos mit Web-Apps interagieren können.Die Bildverarbeitungsalgorithmen sind rechenintensiv und nicht in benutzerdefinierten Bibliotheken verfügbar.Derzeit verwende ich Ruby on Rails auf Heroku für meine Website.

Was wäre die beste Architektur, um dies zu erreichen?Nehmen Sie Bilder von der Website auf, führen Sie einen Bildverarbeitungsalgorithmus aus und zeigen Sie sie wieder auf der Website an

Der Großteil meines Bildverarbeitungscodes basiert auf C/C++.

Kann ich C/C++-Code direkt von Ruby on Rails aus aufrufen?Ist das auf Heroku möglich?

Oder sollte ich ein System entwerfen, in dem C/C++-Code einige APIs bereitstellt, die vom Ruby on Rails-Server aufgerufen werden können?

War es hilfreich?

Lösung

Heroku verwendet normalerweise kleine Instanzen virtueller Maschinen. Je nachdem, wie leistungsstark Ihre Verarbeitung ist, ist dies möglicherweise nicht die beste Wahl für die Architektur.Wenn Sie es jedoch verwenden, würde ich Folgendes tun:

Verwenden Sie für Ihre Verarbeitung ein Hintergrundaufgaben-Gem.Lassen Sie dies in einem separaten Prozess laufen (in der Heroku-Terminologie als Worker und nicht als Dyno bezeichnet).Delayed Job ist eine bewährte Lösung für Hintergrundaufgaben mit zahlreichen Online-Informationen zur Integration in Heroku. Es gibt jedoch auch neuere Lösungen wie Sidekiq, die das neue Threading-System in modernen Versionen von Ruby verwenden.Sie würden zulassen, dass alles im Dyno erledigt wird, aber ich würde sagen, dass es nützlich wäre, die gesamte Hintergrundverarbeitung vom Webserver-Dyno fernzuhalten, sodass ein verzögerter Job (oder ähnliches) in Ordnung wäre.

Was die Integration von C/C++ angeht, musste ich das bisher noch nicht tun.Ich weiß jedoch, dass es möglich ist, Gems zu erstellen, die C- oder C++-Code integrieren und nativ kompilieren.Solange Sie Ruby anstelle von JRuby verwenden, sollte Heroku meiner Meinung nach kein Problem damit haben.Es gibt andere Möglichkeiten, dies zu erreichen. Sehen Sie sich SO-Fragen speziell zu diesem Thema an, z

Wie kann ich C++-Funktionen in Ruby aufrufen?

Es scheint, dass Sie eine Erweiterung und dann ein Gem erstellen müssen, um sie aufzunehmen.Diese Links können hilfreich sein oder auch nicht.

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/

Ich empfehle die Erstellung eines Gems, da es meiner Meinung nach schwierig sein könnte, Bibliotheken oder ausführbare Dateien auf eine Heroku-Instanz zu übertragen.Sie können das Gem in Ihrem Anbieterverzeichnis speichern, wenn Sie es nicht öffentlich machen möchten.

Insgesamt würde ich den Webserver auf S3 hochladen lassen oder wo auch immer Sie die Bilder speichern (dies kann direkt im Browser erfolgen, ohne den Webserver als Sprungbrett mit der AWS JS-API zu verwenden).Suchen Sie nach Edelsteinen, die Ihnen helfen.)

Anschließend kann der Webserver eine Hintergrundaufgabe zur Verarbeitung des Bildes anfordern.

Wenn Sie sie nicht aufbewahren, werden die Dinge etwas interessanter ...Wenn Sie Hintergrundaufgaben verwenden, benötigen Sie eine Datenbank, sodass Sie die Bilddaten möglicherweise als Blob in der Datenbank an den Worker übergeben können.

Ich würde wirklich nicht die gesamte Verarbeitung nur im Webserver-Dyno durchführen, es sei denn, Sie stoßen dieses Ding wirklich nur sehr gelegentlich an.Bei mehreren Benutzern würde es sehr schnell zu einem Engpass kommen.

Der Hintergrundprozess kann ein Flag für die Bildtabellenzeile setzen, sodass der Webserver den Benutzer informieren kann, wenn die Verarbeitung abgeschlossen ist.(Sie können mithilfe von JS auf dem Bildschirm „Upload abgeschlossen“ mithilfe von AJAX Informationen abfragen.)

Natürlich gibt es viele andere Möglichkeiten, dies zu erreichen, abhängig von einer Reihe von Faktoren.

Entschuldigung, dass die Antwort vage ist, aber die Frage ist ziemlich offen.

Viel Glück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top