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