Ruby 如何实现 Ruby 和 Nodejs 通信?

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

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

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

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

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

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

共收到 32 条回复

消息队列,比方说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
个人感觉第三种最简单了

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