Pergunta

Quero executar algoritmos de processamento de imagens no servidor que possam interagir facilmente com aplicativos da web.Os algoritmos de processamento de imagem exigem muita computação e não estarão disponíveis em bibliotecas personalizadas.Atualmente estou usando Ruby on Rails no Heroku para meu site.

Qual seria a melhor arquitetura para conseguir isso?tirar imagens do site - executar algo de processamento de imagem nele - exibir de volta no site

A maior parte do meu código de processamento de imagem está em C/C++.

Posso chamar o código C/C++ diretamente do Ruby on Rails?Isso é possível no Heroku?

Ou devo projetar um sistema onde o código C/C++ exponha algumas APIs que podem ser chamadas pelo servidor Ruby on Rails?

Foi útil?

Solução

Heroku normalmente usa pequenas instâncias de máquinas virtuais, portanto, dependendo de quão pesado é o seu processamento, pode não ser a melhor escolha de arquitetura.No entanto, se você usá-lo, eu faria o seguinte:

Use uma gem de tarefa em segundo plano para fazer seu processamento.Faça com que ele seja executado em um processo separado (chamado de trabalhador em vez de dinamômetro na terminologia do Heroku).Delayed Job é uma solução testada e comprovada para tarefas em segundo plano com uma riqueza de informações on-line relacionadas à integração ao Heroku, mas existem soluções mais recentes, como o Sidekiq, que usam o novo sistema de threading nas versões modernas do Ruby.Eles permitiriam que tudo fosse feito no dinamômetro, mas eu diria que seria útil manter todo o processamento em segundo plano longe dos dinamômetros do servidor web, então o Delayed Job (ou similar) seria adequado.

Quanto à integração de C/C++, ainda não precisei fazer isso.Porém, sei que é possível criar gems que integrem código C ou C++ e compilem nativamente.Contanto que você esteja usando Ruby em vez de JRuby, não acho que o Heroku deva ter problemas com eles.Existem outras maneiras de fazer isso, veja as perguntas do SO especificamente sobre este tópico, como

Como posso chamar funções C++ de dentro do Ruby

Parece que você precisa criar uma extensão e, em seguida, criar uma gema para contê-la.Esses links podem ou não ajudar.

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

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

Eu recomendo fazer uma jóia, pois acho que pode ser difícil obter bibliotecas ou executáveis ​​em uma instância do Heroku.Você pode armazenar a gema em seu diretório de fornecedores se não quiser torná-la pública.

No geral, eu gostaria que o servidor da web fosse carregado para o S3 ou onde quer que você esteja armazenando as imagens (isso pode ser feito diretamente no navegador, sem usar o servidor da web como um trampolim com a API AWS JS.Procure joias para ajudar.)

Em seguida, o servidor web pode solicitar uma tarefa em segundo plano para processar a imagem.

Se você não os armazena, as coisas ficam um pouco mais interessantes...Você precisará de um banco de dados se estiver usando tarefas em segundo plano, para poder passar os dados da imagem para o trabalhador como um blob no banco de dados, talvez.

Eu realmente não faria todo o processamento apenas no dinamômetro do servidor web, a menos que você esteja acessando essa coisa apenas ocasionalmente.Com vários usuários, você encontraria um gargalo muito rapidamente.

O processo em segundo plano pode definir um sinalizador na linha da tabela de imagens para que o servidor da web possa informar ao usuário quando o processamento for concluído.(Você pode pesquisar informações usando JS na tela completa de upload usando AJAX)

É claro que existem muitas outras maneiras de conseguir isso, dependendo de vários fatores.

Peço desculpas pela resposta ser vaga, mas a questão é bastante aberta.

Boa sorte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top