2014-11-26 9 views
4

Я работаю над приложением Ruby on Rails, которое в настоящее время размещено на Heroku. У нас есть около 5 веб-динозавров и около 2 рабочих процессов, работающих в среднем. Но поскольку мы используем adeptscale, это может сильно измениться, и стоимость увеличивается с каждым месяцем.Рубин на рельсах с jRuby

Мы думаем об изменении процесса и инфраструктуры (используя наши собственные, отключенные от amazon/google и т. Д.). А также из-за производительности, доступа к java-библиотекам и других преимуществ, которые мы планируем использовать с jRuby.

У меня совсем нет опыта работы с jRuby, но у меня есть опыт Java. Поэтому у меня есть несколько вопросов:

Вопрос интро: Поскольку рельсы философия/подход отличается от Javas, т.е. рубин веб-сервер использует гораздо меньше памяти, но может обрабатывать только один запрос в то время, и поэтому имеющие нескольких серверов вроде компенси- невозможность обработки нескольких запросов.

  1. Если мы идем с JRuby (и есть наш проект рельсы упаковано как военный файл и развернут на любом контейнере сервлетов т.е. Tomcat или Jboss (больше, чем просто контейнер)), мы будем иметь возможность обрабатывать несколько запросов, то ?

Вопрос интро: В настоящее время мы получили некоторую логику приложения работают в рабочих (вместо того, чтобы блокировать веб-сервер, и не будучи в состоянии обслуживать других клиентов клиентов/браузера). т.е. когда пользователи отправляют какую-либо форму, а затем нашему приложению необходимо обратиться в службу сторонних поставщиков, чтобы вернуть ответ, мы просто позволяем работнику выполнять работу по возврату из сторонней службы и обновлять ui (который сообщает о состоянии ожидания) через websockets что сторонняя служба вернула x/y или любой другой статус.

  1. Если мы перейдем к jRuby, как мы добьемся подобной логики? Я имею в виду, что мы идем с кодом Java, который имеет какую-то пул потоков работников, а затем свободные рабочие делают рабочую нагрузку на связь со сторонней службой и т. Д.? Как мы это сделаем, если решим пойти с jRuby?

ответ

5

1) Вы можете обслуживать несколько запросов одновременно в JRuby с практически любой емкости, но вы можете также обслуживать несколько запросов одновременно с МРТ рубин. У вас должно быть только приложение-потоковое приложение (config.threadsafe! По умолчанию используется в rails4). Различные серверы стойки имеют разные подходы для одновременного обслуживания нескольких запросов. Например, unicorn использует несколько процессов в то время как пассажиры или puma подходят для многопоточного подхода .

В моем опыте контейнеры jruby, такие как jboss или tomcat, более сложны для правильной настройки. Но есть такие вещи, как tourquebox, trinidad, которые помогут вам в этом. Но вы даже можете пойти на некоторые из рубиновых серверов (например, puma), которые не используют расширения c.

2) Если я правильно вас понимаю, вы ищете библиотеку фоновой обработки? Вы можете использовать sidekiq или resque с рубином или jruby (в то время как jruby будет быстрее вообще, и его легче отлаживать утечки памяти).Вы даже можете использовать ruby ​​для своих серверов стойки и jruby для своих рабочих (их можно запускать параллельно с такими вещами, как rvm/rbenv)

В общем, я бы пошел только на вариант jruby, если вы знаете, что делаете, требуется более высокая производительность для серверов приложений или если вы хотите ускорить работу своих рабочих серверов. Если бы я был вами, я бы, вероятно, остался в мире рубинов и использовал puma для вашего приложения и sidekiq в качестве справочной службы. Оба они очень элегантны и не нуждаются в такой конфигурации.

+1

и здесь больше объяснений по рубиновому материалу: http://rtfblog.com/2011/ 05/25/взятие-преимущество-из-многопоточных-среда-с-рубина / –

2
  1. Да, JRuby использует потоки Java и действительно многопоточен. И я могу сказать, что он действительно хорош в интеграции с Java, даже используя классы для JNI. я могу порекомендовать следующие сервера (некоторые из них уже упоминались): (! Даже IBM WebSphere Application Server)

«Самый простой» способ запуска приложения в контейнере сервлетов - сделать .war с warbler. Обычно полученный файл .war содержит все зависимости и интерпретатор JRuby, поэтому итоговый файл обычно составляет 30 Мб. Но я думаю, что настроить качели не так-то просто, поэтому я бы не рекомендовал этого, если вам действительно не нужно запускать Rails в среде корпоративного Java.

И я бы просто напомнил, что Rails открывает соединение БД для любого запроса, тогда размер пула соединений по умолчанию по умолчанию не равен 5 - не забудьте увеличить его до нагрузочного тестирования :) (например, пул потоков по умолчанию для puma - 16, IBM WAS - 50, потоки Tomcat - 200).

Я согласен с smallbutton.com что пума - хороший выбор. Наконец, с помощью puma вы можете легко переключаться между JRuby и другим интерпретатором (по моему опыту есть одно отличие - имена драгоценных камней)

Смежные вопросы