在Rails应用程序和Node.js应用程序之间进行通信

时间:2011-04-04 14:29:50

标签: javascript ruby-on-rails ruby-on-rails-3 node.js

此问题遵循前一个问题:Shall I use Node.js Instead of Rails for Real-time WebApps?

问题:

在Rails应用程序和Node.js应用程序之间进行通信的最佳方式是什么才能利用这两种技术?

由于

5 个答案:

答案 0 :(得分:7)

为什么不打开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套接字上编写一个抽象,以便很好地同步你的通信,而不需要低级别的小提琴。

答案 1 :(得分:6)

为什么应用需要沟通?

如果您只是需要一个Rails应用程序来将一些实时数据导入浏览器,那么使用node.js服务器应用程序和Socket.IO就足够了。

你必须记住,任何Rails应用程序实际上都是两个应用程序,一个是在服务器上运行的Ruby编写的,另一个是在客户端上运行的Javascript编写的。它们通常通过HTTP进行通信,有时使用AJAX进行通信,有时则不通您的应用的哪个部分需要node.js的功能?

如果应用程序处理登录,然后显示网页,然后使用实时数据不断刷新该网页,您只能从node.js获得实时数据刷新的好处,你可以使用AJAX轮询或Websockets来实现。共享数据库是应用程序进行通信的好方法,但不适用于实时。

为了说清楚,如果您是Ruby with Rails的专家,如果添加节点,js服务器应用程序并仅将其用于高容量数据(例如实时更新),则会更高效。然后,您可以使用混合Web应用程序,充分利用两种平台的优势。

答案 2 :(得分:3)

如何保留Rails并使用Faye?

最新的Railscast很棒:http://railscasts.com/episodes/260-messaging-with-faye

答案 3 :(得分:2)

一种方法是拥有一个共同的后端数据库或某种内存存储器,它们将充当两种技术之间的中间层。例如,流行的是使用像Redis这样的NoSQL DB,它快速,基于内存并支持高级数据结构,这对于这种情况很方便。此外,node.js和RoR都有一个很好的客户端库,可以与Redis进行通信。

我想说的主要问题是两个独立系统之间的初始身份验证,这两个系统都需要同步。有与此主题相关的类似问题/答案可能对阅读有用,例如these two显示了解决身份验证问题的可能方法。

答案 4 :(得分:0)

这取决于您将功能从一个功能与另一个功能分开的确切原因。 Rails支持基于REST的分离,无需您做任何额外的工作。它是基于从头开始的资源构建的。这意味着您可以使用http.Client(或类似Restler)来查询它。你可以使用标准的Node.js路由(或类似的Express)和Ruby的HTTP客户端(例如Typhoeus),以相反的方式完成相同的操作。虽然这种方法会产生使用完整HTTP请求的开销(如果在内部网络上,则不一定会出现问题)。如果你正在寻找一种更快速的通信方式,我会说你可以使用持久的插座来解决这个问题,正如雷诺斯所说的那样。

根据您的需要,我建议使用两个独立的系统会产生额外的代码复杂性,最好将它缩减为一个框架/语言。我全都是面向服务的设计,但Rails是一个非常重要的部分,可能会减慢你的所有响应时间,即使有Node.js使用它。