Я создаю приложение Ruby on Rails, которое будет использовать довольно сложные и трудоемкие алгоритмы.
Я думал о реализации их с помощью функции C или C ++.
Я был бы очень признателен, если бы кто-нибудь, имеющий опыт внедрения сложных алгоритмов в веб-приложения, мог бы дать мне несколько советов о том, что делать.
Моя гипотеза заключается в том, что Rails сам по себе слишком медленный и лучше использовать C или C ++. Если это так, как вы можете реализовать алгоритм в C или C ++ и вызывать его с помощью Ruby on Rails?
Хорошо, это очень расплывчатый вопрос, но он делает разговор веселым.
Как правило, описываемая вами проблема — это не техническая проблема, а проблема бизнеса.
Некоторые из огромных преимуществ rails — это скорость разработки, обслуживания и т. Д. C и C ++ также являются отличными инструментами, но для сборки того же самого компонента в C требуется больше времени, чем в rails. Это значит, что это дороже.
Эта стоимость продолжается.
С рельсами вы потеряете некоторую производительность, которая потребует больше оборудования. Эта стоимость продолжается.
Предположим, что сложный алгоритм — это долго выполняющаяся функция, которую можно определить следующим образом в классе User.
def DoIt ()
спать 10000
конец
Теперь давайте также предположим, что вам нужно, чтобы это происходило со многими элементами одновременно. Скажите 10000 пользователей каждую минуту.
Если бы мы делали это в прямолинейном процессе, мы бы смотрели на время выполнения 10000 * 10000 каждую минуту. Это не Буэно.
К счастью, эти проблемы решаются постоянно.
То, что мы обсуждаем, становится вертикальным или горизонтальным масштабированием.
По вертикали:
Предположим, что если вы напишите это в c, функция станет эквивалентом:
def DoIt
спать 5000
конец
Вы получили 50%, и это здорово. Проблема в том, что, если ваша пользовательская нагрузка возрастает, вы попадаете в беду. Мы видим это в производственных системах все время.
Итак, теперь вопрос в том, как вы можете масштабировать это по горизонтали.
Используя resque (или любое из 100 решений для этого), вы можете перенести эту работу в фоновый режим и распространить ее.
Затем вы можете добавить серверы для обработки нагрузки, поступающей в систему.
Теперь возникает вопрос: стоит ли это того, чтобы собирать его в c / c ++, или вам лучше строить его в рельсах и платить за дополнительное оборудование? Или лучше начать с рельсов и, если необходимо, перейти на c ++ / C, когда вы закончили работу над прототипом, и подтвердите, что он необходим.