Обработка изображений на веб-сервере

Я хочу запустить алгоритмы обработки изображений на сервере, который может легко взаимодействовать с веб-приложениями. Алгоритмы обработки изображений требуют больших вычислительных ресурсов и не будут доступны в специально созданных библиотеках. В настоящее время я использую Ruby on Rails на Heroku для своего сайта.

Какая архитектура лучше всего подходит для этого? взять изображения с веб-сайта - запустить на нем алгоритм обработки изображений - отобразить обратно на веб-сайте

Большая часть моего кода обработки изображений написана на C/C++.

Могу ли я напрямую вызывать код C/C++ из Ruby on Rails? Возможно ли это на Heroku?

Или мне следует разработать систему, в которой код C/C++ предоставляет некоторые API-интерфейсы, которые могут вызываться сервером Ruby on Rails?


person godot101    schedule 29.07.2014    source источник


Ответы (1)


Heroku обычно использует небольшие экземпляры виртуальных машин, поэтому в зависимости от того, насколько тяжела ваша обработка, это может быть не лучший выбор архитектуры. Однако, если вы его используете, я бы сделал следующее:

Используйте гем фоновой задачи для обработки. Запустите это в отдельном процессе (в терминологии Heroku он называется worker, а не dyno). Delayed Job — это проверенное и проверенное решение для фоновых задач с большим количеством онлайн-информации, касающейся его интеграции в Heroku, но есть и более новые, такие как Sidekiq, которые используют новую систему потоков в современных версиях Ruby. Они позволили бы все делать в динамометре, но я бы сказал, что было бы полезно отделить всю фоновую обработку от динамометров веб-сервера, поэтому отложенная работа (или аналогичная) будет в порядке.

Что касается интеграции C/C++, то мне пока не нужно было этого делать. Однако я знаю, что можно создавать драгоценные камни, которые интегрируют код C или C++ и компилируются в исходном коде. Пока вы используете ruby, а не JRuby, я не думаю, что у Heroku должны быть с ними проблемы. Есть и другие способы сделать это, посмотрите на вопросы SO конкретно по этой теме, например

Как я могу вызывать функции C++ из ruby

Кажется, вам нужно создать расширение, а затем создать гем, чтобы содержать его. Эти ссылки могут помочь или не помочь.

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. Вы можете сохранить драгоценный камень в каталоге вашего поставщика, если вы не хотите делать его общедоступным.

В целом, я бы загрузил веб-сервер на S3 или туда, где вы храните изображения (это можно сделать непосредственно в браузере, не используя веб-сервер в качестве трамплина с помощью AWS JS API. Ищите драгоценные камни, чтобы помочь.)

Затем веб-сервер может запросить фоновую задачу для обработки изображения.

Если вы их не сохраняете, все становится немного интереснее... Вам понадобится база данных, если вы используете фоновые задачи, чтобы вы могли передать данные изображения рабочему процессу в виде большого двоичного объекта в базе данных.

Я действительно не стал бы выполнять всю обработку только на динамометре веб-сервера, если только вы действительно не нажимаете эту штуку очень редко. С несколькими пользователями вы очень быстро столкнетесь с узким местом.

Фоновый процесс может установить флаг в строке таблицы изображений, чтобы веб-сервер мог сообщить пользователю о завершении обработки. (Вы можете запросить информацию с помощью JS на экране завершения загрузки с помощью AJAX)

Конечно, есть много других способов добиться этого, в зависимости от ряда факторов.

Извините, что ответ расплывчатый, но вопрос довольно открытый.

Удачи.

person A Fader Darkly    schedule 29.07.2014
comment
Спасибо за подробный ответ Fader Darkly. Из вашего ответа кажется, что лучше перейти на AWS. Я не особо разбираюсь в Heroku, так как я просто использовал его для тестирования своего приложения, так как это удобно с Rails. Тогда у меня есть следующие вопросы: 1. Какой тип сервера AWS наиболее подходит для этого приложения, поскольку это будет операция с интенсивными вычислениями 2. Если я буду использовать AWS, можно ли будет запускать исполняемый файл для кода C/C++, а не сделать из него драгоценный камень? 3. Какую архитектуру будет иметь фоновая задача обработки изображения? Должен ли это быть сервер на основе C/C++ или на основе ruby? - person godot101; 29.07.2014
comment
Я бы предпочел AWS для таких махинаций. 1: Не знаю - предлагаю начать с малого и апгрейдить по мере необходимости. 2: Да - у вас будет полный доступ к серверу, поэтому вы сможете настроить его по своему усмотрению. Вы даже можете использовать Ruby для запуска исполняемого файла командной строки, чтобы выполнить обработку, если хотите, хотя я, конечно, не рекомендую этого! Я думаю, что создание драгоценного камня было бы самым чистым способом во всех отношениях. 3: Если вы собираетесь использовать Ruby для веб-сервера, то имеет смысл использовать одну и ту же технологию везде. Однако такие вещи, как RabbitMQ, допускают разные серверные части... - person A Fader Darkly; 29.07.2014
comment
Прохладный. 1. Думаю начать с EC2. 2. Я думал запустить исполняемый файл командной строки из Ruby. Постараюсь сделать драгоценный камень, поймите, насколько это сложно. 3. Я начал с Ruby, но есть ли другой фреймворк/стек, который лучше подходит для моей цели? Я исключил Django, так как не смог найти достаточно материала в Интернете. Любые другие мысли? - person godot101; 29.07.2014
comment
3: Хороший вопрос. Есть несколько веб-фреймворков C++, и я понятия не имею, хороши ли они. В остальном все они имеют преимущества и недостатки. Rails хорош тем, что вы уже немного поработали над ним, но также и тем, что, как вы узнали, вокруг него существует большое сообщество. - person A Fader Darkly; 29.07.2014