Я хочу запустить алгоритмы обработки изображений на сервере, который может легко взаимодействовать с веб-приложениями. Алгоритмы обработки изображений требуют значительных вычислительных ресурсов и не будут доступны в пользовательских библиотеках. В настоящее время я использую Ruby on Rails на Heroku для своего сайта.
Какова будет лучшая архитектура для достижения этой цели? взять изображения с сайта — запустить алгоритм обработки изображений на нем — отобразить обратно на сайт
Большая часть моего кода обработки изображений находится на C / C ++.
Могу ли я вызвать код C / C ++ из Ruby on Rails напрямую? Это возможно на Heroku?
Или я должен спроектировать систему, в которой код C / C ++ предоставляет некоторые API, которые могут вызываться сервером Ruby on Rails?
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)
Конечно, есть много других способов сделать это, в зависимости от ряда факторов.
Извиняюсь, что ответ расплывчатый, но вопрос довольно открытый.
Удачи.