Общайтесь между приложением 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, чтобы синхронизировать вашу связь красиво и без необходимости играть на среднем уровне.
Ответ 3
Как насчет сохранения Rails и использования Faye?
последний Railscast является потрясающим: http://railscasts.com/episodes/260-messaging-with-faye
Ответ 4
Один из способов - иметь общую базовую базу данных или какое-то запоминающее устройство, которое будет действовать как промежуточный уровень между двумя технологиями. Популярным является, например, использование NoSQL DB, такого как Redis, который работает быстро, на основе памяти и поддерживает расширенные структуры данных, которые удобны для этого сценария. Кроме того, node.js и RoR имеют хорошие клиентские библиотеки для связи с Redis.
Я бы сказал, что основная проблема заключается в первоначальной аутентификации между двумя отдельными системами, которые должны быть синхронизированы. Есть похожие вопросы/ответы, связанные с этой темой, которые могут оказаться полезными для чтения, например этих двух какие возможные способы решения проблемы аутентификации.
Ответ 5
Это зависит от того, почему вы отделяете функциональность от одного к другому. Rails поддерживает разделение на основе REST без дополнительной работы с вашей стороны. Он построен на основе ресурсов с нуля. Это означает, что вам будет очень просто использовать http.Client(или что-то вроде Restler) для запроса на него. Вы можете, конечно, сделать то же самое наоборот, используя стандартную маршрутизацию Node.js(или что-то вроде Express) и HTTP-клиент для Ruby (например, Typhoeus). Хотя этот метод несет накладные расходы на использование полного HTTP-запроса (не обязательно проблема, если во внутренней сети). Если вы ищете более быстрый способ общения, я бы сказал, что вы можете использовать его, используя устойчивый сокет, как предлагает Райнос.
В зависимости от ваших потребностей я бы предположил, что использование двух отдельных систем создает дополнительную сложность кода, и вам может быть лучше всего свести его к одному фрейму/языку. Я все для сервис-ориентированного дизайна, но Rails - довольно тяжелый вес и может замедлить ваше время ответа, даже если с ним работает Node.js.