Ruby 如何实现 Ruby 和 Nodejs 通信?

gockxml · 2013年09月27日 · 最后由 towonzhou 回复于 2013年09月27日 · 5333 次阅读

Rails 做 Application Server,有一段服务是用 Nodejs 写的,现在需要 Ruby 去调用 Nodejs 进行数据处理。

目前我知道的可行方案有:

一种方法是直接在 Ruby 里跑命令行node app.js arg1 arg2,但略挫了点,而且 Nodejs 的代码里是有数据库/redis 连接的,每次重新连接,是不是会造成额外的开销?

另一种方法是通过 Unix Domain Socket,但我实在没找到关于这方面比较好的库。自己手写一个 Socket 通信模型,水太深,不敢碰。

google 了各种资料也没发现合适的,所以来求助各位了。

消息队列,比方说 zmq

看看你的 node 进程是不是需要长驻运行的,不是话用命令行调也没什么不好, 否则就用 socket,跨平台。

1, 信号 Process.kill(SIG*, process_id) 缺点是可用信号少。 2,Pipe 3, Socket(TCP|Unix Domain) 4, Message Queue

=========== redis 的话可以考虑 1)共享一个数据结构(考虑一下读写锁的问题)2 redis 支持 pubsub,可以用一下。

楼上都很麻烦。用 node 实现一个 RESTful API 既可以了啊 简单方便

#1 楼 @jjx cool,感觉是我想要的!我再仔细研究下,非常感谢!

#4 楼 @shawnyu 那要走网络传输啊,还有 http 的一堆东西,本来是在一台机器上的。虽然我对性能不是很 care,但这样确实太奢侈了。。

这有什么性能问题,首先 node 做 http 协议 不在话下,ruby 做 httpclient 更是一大把工具

#2 楼 @newghost 有数据库连接的,应该算常驻吧?

只能说这是最简单的 比队列这些坑少 而且好调试。

#4 楼 @shawnyu node 的 restful api 也未必就是简单方案,express 等框架的路由可不向 rails 一样 restful。

#10 楼 @kevinxu @shawnyu restful 倒没必要,很简单的通信,只有两个接口,只读,不修改。

12 楼 已删除

#12 楼 @kevinxu 还需要读,考虑一下其他吧

#1 楼 @jjx 再架一个 zero mq ? 没这个必要吧. 已经有 Redis 为什么不用 Pub/Sub?

node.js net 模块看看,有 socket 支持,没搞懂为什会想自己实现 socket 这套方案?喜欢重造轮子? http://nodejs.org/api/net.html

#4 楼 @shawnyu 我也会倾向 RESTful API。用 node.js express.js 提供实现。 性能问题,没数据,没需求没必要瞎猜。

一种方法是直接在Ruby里跑命令行node app.js arg1 arg2,但略挫了点,而且Nodejs的代码里是有数据库/redis连接的,每次重新连接,是不是会造成额外的开销?

建议自己测试一下开销,这个方案很直接,很简单。做重构也很方便。

考虑用 redis 共享数据?MQ 之类的? 或者走 API 的方式,很多啊。。。

我觉得性能以后可以调优,而且以后说不定不在一台机器上,RESTful API 是比较简单的方案

#14 楼 @lvjian700 好吧 看来我又有点过早优化了,而且没数据就担心性能问题了。谢谢敲醒。

我知道有 socket server 库,抄个简单通讯的例子也挺快。但怕实际用起来,要考虑的方面太多,所以想问有没有更高一层的封装。

#16 楼 @sanivbyfish 恩 目前也有点倾向于这个方案了。谢谢。

#14 楼 @lvjian700

zmq 不是一般想象的消息队列,用于不同语言的交互是很好的选择。比方说 req/rep 模式,5 到 6 行代码就可以搭出一个 c/s 结构

lz 的需求是工作进程性质,用 zmq 更适合,zmq 支持多种结构混搭,随时都加入 proxy 可以扩容到更多的工作进程

#19 楼 @jjx

Rails做Application Server,有一段服务是用Nodejs写的,现在需要Ruby去调用Nodejs进行数据处理。

这个场景不复杂,是否需要扩容,是否需要支持更多混搭暂时看不出来。 ZeroMQ 安装,部署,使用,维护都需要不小的成本,这个成本跟 command line, RESTful 比,哪个更合适,这个需要考虑。

#19 楼 @jjx ZeroMQ 文档还是需要梯子才能访问 = =||

#21 楼 @lvjian700 这次场景比较简单,先用 RESTful 顶着。感谢 @jjx 建议的 zmq,很好的东西,只不过有点学习成本,这次先不用,相信以后能用到。

既然已经有 Redis 了,那用 Redis 是最方便也最可靠的方案。 用 Blpop 或者 Pub/Sub,自己稍微封装一下,就是一个 RPC 调用了。

大家普遍倾向于使用 queue 或者 redis 这样的中间暂存方式来解决异构系统之间的通讯。 但是我感觉 socket 并没有想象中那么复杂呀,之前写过一个类似的东西,只要找一个入门 tutorial 试着动手开始写,那么最难的部分就已经不存在了。

#24 楼 @lgn21st (看着你这段话,脑补了一下你说话的语气。。teamhour 忠实粉 =。 =)恩,简单的通信模型挺好写的,但要写得健壮/可用,估计就不是很简单了吧(我猜的)。所以我想问问有没有人已经造好这个轮子了。

#25 楼 @gockxml 谢谢你收听 Teahour。

说实话我只写过 Ruby 版本的 Socket 模块,没有写过 Node 的。写的时候在网上找到一个教程,照猫画虎写完实践才慢慢弄明白很多细节原理的。我想 Node 的原理是一样的,而且如果去搜的话,必然会搜到大量的轮子或者例子。如果特别在意健壮和可用,到底需要写到什么程度才能达到需要的健壮和可用性?我的经验是在实际场景中不断测试和改进。

#26 楼 @lgn21st 说的很对,但其实我的场景是”混蛋还有 2 天就要上线了前端样式还没做完至于后台通信赶紧找个东西先顶着“。。所以,心态很重要 =,= 不过确实只有你说的这样才能进步。我有个 side project,可以这么搞搞实验。thx~

#27 楼 @gockxml 这... 表示理解。

有 redis 或者其他共享存储的东西,就用共享存储。这个方便。

没有的话,就进程间传数据吧。白手写 Socket 的方式有点古典了,普通应用就 HTTP 吧。写 Socket 实现通信除非性能要求很高,不然还是架在 HTTP 上为好。毕竟 HTTP 开发简单。缺点就是每次请求开销稍微大一些。

两边都有成熟的 web framework,我想不出来还有什么比两个应用基于 web api 互相协作更容易的了,服务化不就图个方便么

感觉还是 resutfull api 比较可行,用运行命令的方式来做感觉可靠性太差。

1: node 的 socket 也行,有个库叫 socket.io 很方便. 2: 写个 dbus 服务 3: 直接当 webserver 用呗,用 web api 就很好,express 就搞定,想 resetful 点就用 express-resource
个人感觉第三种最简单了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号