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

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

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

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

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

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

1

Решение

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

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

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

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

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

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. Посмотрите на драгоценные камни, чтобы помочь.)

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

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

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

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

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

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

Удачи.

3

Другие решения


По вопросам рекламы [email protected]