Общайтесь между приложением Rails и приложением Node.js.

Этот вопрос следует предыдущему: Использовать ли Node.js Вместо Rails для WebApps в реальном времени?

Вопрос:

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

Спасибо

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

Почему бы не открыть сокет TCP для связи между node и 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, чтобы синхронизировать вашу связь красиво и без необходимости играть на среднем уровне.

Ответ 4

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

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

Ответ 5

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

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