1

Web アプリと簡単にやり取りできるサーバー上で画像処理アルゴリズムを実行したいと考えています。画像処理アルゴリズムは計算負荷が高く、カスタム ビルド ライブラリでは使用できません。現在、私は自分のウェブサイトに Heroku で Ruby on Rails を使用しています。

これを達成するための最良のアーキテクチャは何でしょうか? ウェブサイトから画像を取得 - 画像処理アルゴリズムを実行 - ウェブサイトに表示

私の画像処理コードのほとんどは C/C++ です。

Ruby on Rails から C/C++ コードを直接呼び出すことはできますか? これは Heroku で可能ですか?

または、Ruby on Rails サーバーから呼び出せる API を C/C++ コードで公開するシステムを設計する必要がありますか?

4

1 に答える 1

3

通常、Heroku は小さな仮想マシン インスタンスを使用するため、処理の負荷によっては、最適なアーキテクチャの選択ではない場合があります。ただし、使用する場合は、次のようにします。

バックグラウンド タスク gem を使用して処理を行います。これを別のプロセス (Heroku 用語では dyno ではなくワーカーと呼びます) で実行します。Delayed Job は、Heroku への統合に関する豊富なオンライン情報を備えた、バックグラウンド タスクの実証済みのソリューションですが、最新バージョンの Ruby で新しいスレッド システムを使用する Sidekiq のような新しいものもあります。それらはすべてを dyno で実行できるようにしますが、すべてのバックグラウンド処理を Web サーバーの dyno から遠ざけておくと便利だと思います。そのため、Delayed Job (または同様のもの) で問題ありません。

C/C++ の統合に関しては、まだこれを行う必要はありません。ただし、C または C++ コードを統合してネイティブにコンパイルする gem を作成できることはわかっています。JRuby ではなく Ruby を使用している限り、Heroku で問題が発生することはないと思います。これを達成する他の方法があります。具体的には、このトピックに関する SO の質問を見てください。

Ruby内からC++関数を呼び出すにはどうすればよいですか

拡張機能を作成してから、それを含む gem を作成する必要があるようです。これらのリンクは役立つ場合とそうでない場合があります。

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/

ライブラリや実行可能ファイルを Heroku インスタンスに追加するのは難しいと思うので、gem を作成することをお勧めします。公開したくない場合は、gem をベンダー ディレクトリに保存できます。

全体として、ウェブサーバーを S3 または画像を保存している場所にアップロードします (これは、ウェブサーバーを AWS JS API の足がかりとして使用せずにブラウザで直接行うことができます。役立つ宝石を探してください。)

次に、Web サーバーはバックグラウンド タスクを要求して画像を処理できます。

それらを保存していない場合、事態はもう少し興味深いものになります...バックグラウンドタスクを使用している場合はデータベースが必要になるため、画像データをデータベースのブロブとしてワーカーに渡すことができます。

あなたが本当にたまにしかこのことを打たない限り、私は本当にウェブサーバーのdynoだけですべての処理をするつもりはありません。複数のユーザーがいると、すぐにボトルネックにぶつかります。

バックグラウンド プロセスは、画像テーブルの行にフラグを設定できるため、Web サーバーは処理の完了をユーザーに知らせることができます。(AJAXを利用したアップロード完了画面でJSを利用して情報をポーリングできます)

もちろん、さまざまな要因に応じて、これを実現する方法は他にもたくさんあります。

答えが曖昧であることをお詫びしますが、質問はかなり自由回答です。

幸運を。

于 2014-07-29T10:47:19.767 に答える