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

这个问题跟在前面的问题: 我应该使用Node.js而不是Rails的实时WebApps?

问题是:

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

谢谢

为什么这些应用程序需要沟通?

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

您必须记住,任何Rails应用程序实际上是两个应用程序,一个是在服务器上运行的Ruby中编写的,一个是在客户端上运行的JavaScript编写的。 他们通常通过HTTP进行通信,有时通过AJAX进行通信,有时候不会。 哪个部分的应用程序需要node.js的function?

如果是应用程序处理login的情况,然后显示一个网页,然后不断刷新实时数据的网页,你只有真正从node.js获得实时数据刷新的好处,无论你做与AJAX轮询或Websockets。 共享数据库是应用程序通信的好方法,但不是实时的。

为了说清楚,如果您是Ruby with Rails的专家,如果您添加节点,js服务器应用程序并仅将其用于高容量数据(如实时更新),则效率会更高。 然后你有一个混合的Web应用程序,利用这两个平台的最好的。

为什么不打开节点和RoR之间通信的TCP套接字?

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套接字的顶部写一个抽象,以很好的同步你的通信,而不需要低级别的摆弄。

保持Rails和使用Faye呢?

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

一种方法是build立一个通用的后端数据库或某种存储器,作为这两种技术之间的中介层。 stream行是例如像Redis那样使用NoSQL DB,这是快速的,基于内存的,并且支持在这种情况下方便的高级数据结构。 另外node.js和RoR都有一个很好的客户端库来与Redis进行通信。

我想说的主要问题是两个单独的系统之间的初始authentication,这两个系统都需要同步。 有关于这个主题的类似的问题/答案可能会有助于阅读,例如这 两个展示如何解决authentication问题的可能方式。

这取决于你为什么要将function从一个分开到另一个。 Rails支持基于REST的分离,而无需任何额外的工作。 它是build立在资源基础上的。 这意味着使用http.Client(或类似Restler)来查询它会非常简单。 使用标准的Node.js路由(或类似Express)和Ruby的HTTP客户端(如Typhoeus),你当然可以完全相同。 虽然这种方法会导致使用完整的HTTP请求(如果在内部networking上不一定是个问题)的开销。 如果你正在寻找一种更快捷的沟通方式,我会说你可以用一个持久的插口去做,就像Raynos所说的那样。

根据您的需要,我build议使用两个单独的系统会产生额外的代码复杂性,最好是将其减less到一个框架/语言。 我都是面向服务的devise,但Rails是一个相当重的分量,可能会减慢你的响应时间,甚至有Node.js的工作。