Связь между приложением Rails и приложением Node.js - PullRequest
13 голосов
/ 04 апреля 2011

Этот вопрос следует за предыдущим: Должен ли я использовать Node.js вместо Rails для веб-приложений реального времени?

Вопрос:

Как лучше всего взаимодействовать между приложением Rails и приложением Node.js, чтобы воспользоваться обеими технологиями?

Спасибо

Ответы [ 5 ]

7 голосов
/ 04 апреля 2011

Почему бы не открыть сокет TCP для связи между узлом и RoR?

var net = require('net');

// create TCP server
var server = net.createServer(function (socket) {
  // write down socket
  socket.write("Echo server\r\n");
  socket.pipe(socket);
})

// start server listening on port 8124
server.listen(8124, "127.0.0.1");

А в RoR можно подключиться к розетке

require 'socket'      # Sockets are in standard library

hostname = '127.0.0.1'
port = 8124

s = TCPSocket.open(hostname, port)

while line = s.gets   # Read lines from the socket
  puts line.chop      # And print with platform line terminator
end
s.close               # Close the socket when done

Затем просто напишите абстракцию в верхней части этого сокета TCP, чтобы синхронизировать ваше общение без лишних хлопот.

6 голосов
/ 05 апреля 2011

Почему приложения должны взаимодействовать?

Если вам просто нужно приложение Rails для передачи данных в реальном времени в браузер, тогда достаточно использовать серверное приложение node.js и Socket.IO.

Вы должны помнить, что любые приложения Rails на самом деле являются двумя приложениями, одно из которых написано на Ruby, работающем на сервере, и одно, написанное на Javascript, работающем на клиенте.Обычно они общаются по HTTP, иногда с AJAX, а иногда нет.Какая часть вашего приложения нуждается в функциональности node.js?

Если в этом случае приложение имеет дело с входом в систему, затем отображает веб-страницу, а затем постоянно обновляет эту веб-страницу данными в реальном времени,вы действительно получаете выгоду от node.js для обновления данных в реальном времени независимо от того, делаете ли вы это с помощью AJAX-опроса или с помощью Websockets.Совместно используемые базы данных - хороший способ взаимодействия приложений, но не в реальном времени.

Чтобы было ясно, если вы являетесь экспертом в Ruby с Rails, вы будете более продуктивными, если добавите узел, js-серверприложение и использовать его только для больших объемов данных, таких как обновления в реальном времени.Затем у вас есть гибридное веб-приложение, которое использует лучшее из обеих платформ.

3 голосов
/ 05 апреля 2011

А как насчет хранения Rails и использования Faye?

последний Railscast потрясающий: http://railscasts.com/episodes/260-messaging-with-faye

2 голосов
/ 04 апреля 2011

Одним из способов является создание общей серверной базы данных или некоторого вида памяти, которая будет выполнять роль промежуточного уровня между двумя технологиями.Например, популярным является использование NoSQL DB, такого как Redis, который быстр, основан на памяти и поддерживает расширенные структуры данных, которые удобны для этого сценария.Кроме того, node.js и RoR имеют хорошие клиентские библиотеки для связи с Redis.

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

0 голосов
/ 06 апреля 2011

Это зависит от того, почему именно вы отделяете функциональность от одного к другому.Rails поддерживает разделение на основе REST без дополнительной работы с вашей стороны.Он построен на основе ресурсов с нуля.Это означает, что для вас было бы очень просто использовать http.Client (или что-то вроде Restler) для запроса к нему.Вы, конечно, можете сделать то же самое, наоборот, используя стандартную маршрутизацию Node.js (или что-то вроде Express) и HTTP-клиент для Ruby (например, Typhoeus).Хотя этот метод требует дополнительных HTTP-запросов (не обязательно проблема во внутренней сети).Если вы ищете более быстрый способ связи, я бы сказал, что вы могли бы сделать это, используя постоянный сокет, как предлагает Рейнос.

В зависимости от ваших потребностей, я бы предложил, что использование двух отдельных систем создает дополнительныесложность кода, и вам может быть лучше сократить ее до одного фреймворка / языка.Я целиком и полностью за сервис-ориентированный дизайн, но Rails довольно тяжелый вес и может замедлить ваше время отклика даже при работе с Node.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...