Rails 做 Application Server,有一段服务是用 Nodejs 写的,现在需要 Ruby 去调用 Nodejs 进行数据处理。
目前我知道的可行方案有:
一种方法是直接在 Ruby 里跑命令行node app.js arg1 arg2
,但略挫了点,而且 Nodejs 的代码里是有数据库/redis 连接的,每次重新连接,是不是会造成额外的开销?
另一种方法是通过 Unix Domain Socket,但我实在没找到关于这方面比较好的库。自己手写一个 Socket 通信模型,水太深,不敢碰。
google 了各种资料也没发现合适的,所以来求助各位了。
1, 信号 Process.kill(SIG*, process_id) 缺点是可用信号少。 2,Pipe 3, Socket(TCP|Unix Domain) 4, Message Queue
=========== redis 的话可以考虑 1)共享一个数据结构(考虑一下读写锁的问题)2 redis 支持 pubsub,可以用一下。
#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连接的,每次重新连接,是不是会造成额外的开销?
建议自己测试一下开销,这个方案很直接,很简单。做重构也很方便。
#14 楼 @lvjian700 好吧 看来我又有点过早优化了,而且没数据就担心性能问题了。谢谢敲醒。
我知道有 socket server 库,抄个简单通讯的例子也挺快。但怕实际用起来,要考虑的方面太多,所以想问有没有更高一层的封装。
zmq 不是一般想象的消息队列,用于不同语言的交互是很好的选择。比方说 req/rep 模式,5 到 6 行代码就可以搭出一个 c/s 结构
lz 的需求是工作进程性质,用 zmq 更适合,zmq 支持多种结构混搭,随时都加入 proxy 可以扩容到更多的工作进程
Rails做Application Server,有一段服务是用Nodejs写的,现在需要Ruby去调用Nodejs进行数据处理。
这个场景不复杂,是否需要扩容,是否需要支持更多混搭暂时看不出来。 ZeroMQ 安装,部署,使用,维护都需要不小的成本,这个成本跟 command line, RESTful 比,哪个更合适,这个需要考虑。
#21 楼 @lvjian700 这次场景比较简单,先用 RESTful 顶着。感谢 @jjx 建议的 zmq,很好的东西,只不过有点学习成本,这次先不用,相信以后能用到。
既然已经有 Redis 了,那用 Redis 是最方便也最可靠的方案。 用 Blpop 或者 Pub/Sub,自己稍微封装一下,就是一个 RPC 调用了。
大家普遍倾向于使用 queue 或者 redis 这样的中间暂存方式来解决异构系统之间的通讯。 但是我感觉 socket 并没有想象中那么复杂呀,之前写过一个类似的东西,只要找一个入门 tutorial 试着动手开始写,那么最难的部分就已经不存在了。
说实话我只写过 Ruby 版本的 Socket 模块,没有写过 Node 的。写的时候在网上找到一个教程,照猫画虎写完实践才慢慢弄明白很多细节原理的。我想 Node 的原理是一样的,而且如果去搜的话,必然会搜到大量的轮子或者例子。如果特别在意健壮和可用,到底需要写到什么程度才能达到需要的健壮和可用性?我的经验是在实际场景中不断测试和改进。
有 redis 或者其他共享存储的东西,就用共享存储。这个方便。
没有的话,就进程间传数据吧。白手写 Socket 的方式有点古典了,普通应用就 HTTP 吧。写 Socket 实现通信除非性能要求很高,不然还是架在 HTTP 上为好。毕竟 HTTP 开发简单。缺点就是每次请求开销稍微大一些。
1: node 的 socket 也行,有个库叫 socket.io 很方便.
2: 写个 dbus 服务
3: 直接当 webserver 用呗,用 web api 就很好,express 就搞定,想 resetful 点就用 express-resource
个人感觉第三种最简单了