Объединение приложения clojure с приложением Ruby on Rails - PullRequest
5 голосов
/ 07 ноября 2011

У меня есть серверная часть Clojure, в которую я хочу добавить интерфейс Rails.Как мне их соединить и как конкретно это сделать?

От макушки головы есть два способа:

  • запустить Jruby на рельсах в одном и том же процессепоскольку приложение clojure
  • запускает обычный Ruby on Rails и подключает его к бэкэнду clojure через очередь сообщений, веб-хуки и через объединенную базу данных.недостатки.В первом случае кажется, что запуск jruby ограничит количество драгоценных камней, которые мы можем повторно использовать, и в противном случае будет стоить нам производительности, когда авторы библиотек не сделали что-то идеально совместимое.В последнем случае, я думаю, мы упустим повторное использование кода - возможно, придется реализовать одну и ту же вещь дважды в некоторых случаях - и что более сложные интерфейсы (например, веб-хуки вместо просто вызовов функций) будут стоить нам.

    Наконец, в случае с JRuby, неясно , как на самом деле соединяет их.Оба поставляются со скриптами управления: rake и leiningen, а также с конкретными макетами репозитория.Я действительно не знаю, как начать объединять их вместе.Консультации и истории войны приветствуются.

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Я еще ничего не сделал с Clojure + JRuby, но я попробовал JRuby + Scala / Java.

Сторона Scala / Java работает как сервисный уровень, а поверх него стоит JRuby on Rails. Оба проекта управляются отдельно: проект Scala / Java компилируется через Maven в JAR, который затем добавляется в качестве зависимости к приложению Rails.

Кажется, это работает довольно хорошо, и я думаю, Clojure будет работать еще лучше, потому что коллекции Clojure реализуют интерфейсы, которые использует JRuby, в Scala мне пришлось настроить интерфейсы уровня обслуживания.

1 голос
/ 07 ноября 2011

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

То, о чем вы говорите, - это довольно типичная настройка SOA, и это одна из замечательных особенностей SOA - вы можете использовать разные языки и платформы там, где они работают лучше всего. Попытка использовать clojure в настройке jruby-on-rails может привести к большим страданиям и страданиям, и IIRC воспользуется некоторыми преимуществами использования clojure в первую очередь.

К сожалению, у меня нет каких-либо военных историй, которые бы точно соответствовали тому, что вы пытаетесь сделать, но я сейчас нахожусь в середине такой архитектуры, и она отлично работает, используя RabbitMQ, чтобы позволить MRI 1.9 поговорите с работниками бэкэнда под управлением JRuby. Не знаю, как вы будете использовать сообщения в ближайшем будущем, но я думаю, что где-то должны быть документы, и вы сможете поддерживать чистое разделение. Если бы вы запускали свой клиентский интерфейс на jruby, вы все равно можете обмениваться кодом между процессом jruby и серверным интерфейсом clojure без необходимости помещать их в один и тот же процесс.

0 голосов
/ 07 ноября 2011

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

Если вы можете заставить его работать, я настоятельно рекомендую пойти по маршруту JRuby по следующим причинам:

  • Меньше зависимостей для развертывания - вам просто нужна JVM и ваши соответствующие файлы / войны
  • Вы получите более высокую производительность, используя внутрипроцессное взаимодействие, чем с очередями и т. Д.
  • Архитектурно будет проще и проще в обслуживании
  • Вы получите доступ ко всей экосистеме библиотек Java из JRuby - в зависимости от ваших конкретных потребностей это может легко восполнить драгоценные камни, которые вы потеряете из-за проблем совместимости
  • Вы сможете использовать одинаковые классы и общие библиотеки из обеих сред

Что касается макетов проектов, я ожидаю, что самый простой подход - создать два разных проекта, упаковать один в качестве jar и включить его в качестве библиотеки для другого.

...