使用 Go 语言来提升 Ruby 应用的性能 已翻译 100%

oschina 投递于 2015/01/14 09:58 (共 6 段, 翻译完成于 01-17)
阅读 6618
收藏 43
2
加载中

近年来,Go语言的表现相当引人注目。它与Ruby的差异明显,Go的优势,例如成本低廉且易用的并发性能,使得我们寻找如何使用的方法,应用到处理工作任务中去。本文着重于阐述能够引领你在ruby应用程序中使用Go的理由。并且会深入细节,我会提供我的启动项目Firmapi的源代码。

Go可以为ruby开发者带来什么

更准确的说,Go可以给你的ruby代码带来什么

1.低成本且易用的并发

按照Go的设计,几十个(甚至上千个)并发操作能够轻而易举的实现。它能够充分利用所有CPU的优势。

尽管使用ruby早就可以处理线程操作了,但是其处理结果远比不上Go:Ruby使用的是绿色线程,(即只有一个CPU得到利用),这与Go的channels方式相去甚远。

BruceLinxu
BruceLinxu
翻译于 2015/01/14 21:46
1

2. 低内存开销

一个 Go 程序编译出来也就几 M 大小。他们能在最大化“榨取”机器性能的同时高效的利用内存。在 资源密集任务中独立的获取输入并返回计算结果 这类情况中,Golang 的表现堪称完美。你能轻松的启动的多个程序,他们只有在需要时才被唤醒,同时还能得到非常不错的性能。

3. 易于部署

Go 程序能在数秒内被编译成一个小的二进制文件。 无需任何依赖,他们就能被轻松部署到您的生产服务器上。稍后,我将在 Firmapi 上向您展示我们是如何将 Go 代码部署到我们的服务器上的。

泥牛
泥牛
翻译于 2015/01/15 09:13
1

连通 Go 和 Ruby

已经有 一个 gem 被发布出来,使之成为可能。但我还是决定不用它,因为我觉得(这个 gem)让 Go 程序作为服务端在后台运行,然后通过 Unix 域套接字来与前端的 Ruby 程序通信有点太麻烦了,最后我尝试了一个直截了当的方法:

其实非常简单: 让 Go 程序返回一个 JSON 格式的数据,然后在 Ruby 程序里解析它。 这样一来,我们就能用 Go 程序加速所有资源密集型任务了。他们将会在服务器上被编译进二进制文件。这些 Go 程序在每次被调用之后都会返回一个 JSON 格式的数据给 Ruby 程序使用。

泥牛
泥牛
翻译于 2015/01/15 10:33
1

1.  Go 方面

我们期望Go程序能返回一个JSON,用Ruby解析标准化输出,这有个例子。

虽然有很多复杂的好用的程序用的是自有变量,但是中心思想不会变了。

2.  Ruby 方面

Ruby 代码则可精简到一行 :

为了保持井井有条,Go程序会被放在自己的文件夹里。这样部署起来容易点。然后写一个执行对应的Go程序的类,来解析和响应JSON。在生产环境中则会用二进制包来增加执行效率。下面是一则类的可能:

用method_missing这个类,在不改变Ruby代码的情况下,让新的Go程序跑起来。开发者只需按照这个规则,添加新程序就可以了。

重刃无锋
重刃无锋
翻译于 2015/01/16 16:55
1

怎么组织代码?

笔者赞成直接把Go代码包含到你的主资源库内。如果要添加的程序的大小和范围所剩无几,你可以使用源控制来多获取一些。主要是Ruby程序和Go程序之间的版本要不一致。例子中,我把代码保存到: my_app/go/program1/

部署

用Go构建程序,Go生成的二进制包既可以在本地环境运行,也可以在产品上运行。唯一的问题是怎样部署这些文件:即可以上传到云存储上(如Amazon S3),然后在部署环境上依次下载,也可以直接上传到部署环境。在我们的例子中,我们添加定制任务到 Capistrano (戳这里看脚本 用的是上传到S3的方法) :

重刃无锋
重刃无锋
翻译于 2015/01/17 09:12
1

在服务器上不用采取任何措施。 对于GO的版本,GOPATH等等,没有依赖。它是完美的!

结论

学习Go可能会带给你在当前Ruby中解决问题的思路,而不会带来另外的设置上的麻烦。我特别推荐看一下那些比较好的Go例程和专栏。

我期盼通过这条途径得到(你的)反馈! 你可以在Twitter上找到我 : @antoinefink 或者发(E-mail) antoine@finkelstein.fr.

溪边九节
溪边九节
翻译于 2015/01/14 22:01
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(47)

老枪AG
老枪AG

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈

引用来自“LeeRoBeRt”的评论

go吹 醒醒吧 google爹一向有抛弃自己作品的传统 半死不活dart, 废品gwt, 残次品angular 再到打肿脸充胖子的go 哪个能拿得出手?
我也水一下:愤怒只是无能的一种表现,嘲笑只是无能的借口而已。哈哈,人生需要多点正能量。
w
wppiwyye
感觉作者闲的蛋疼。
Z
ZXEOC

引用来自“冰力”的评论

《使用 PHP 来提升 RUBY 性能》《使用 D 语言来提升 RUBY 性能》《使用 Python 来提升 RUBY 性能》《使用 Rust 来提升 RUBY 性能》《使用 C++ 来提升 RUBY 性能》《使用 mono 来提升 RUBY 性能》《使用 Java 来提升 RUBY 性能》...

引用来自“Raymin”的评论

哈哈!是个语言都可以提升 Ruby 的性能!
《使用COBOL来提升RUBY忄
开源中国匿名会员
开源中国匿名会员

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈

引用来自“LeeRoBeRt”的评论

go吹 醒醒吧 google爹一向有抛弃自己作品的传统 半死不活dart, 废品gwt, 残次品angular 再到打肿脸充胖子的go 哪个能拿得出手?

引用来自“神州浪子”的评论

哟,开始抱rust的大腿啦?嗯 google没啥能拿出手,那咋还没倒闭呢?那咋业内一提到google就说是最伟大的公司呢?您拿出一个能拿出手的东西?拿不出来?废物就知道过嘴炮瘾

引用来自“LeeRoBeRt”的评论

哈哈 go吹那么快就怂了啊 又来你行你上啊这套逻辑了 我评论个冰箱还要自己会制冷啊?

引用来自“神州浪子”的评论

是啊,从go的beta版开始就有脑残go黑开始说go不行,还举了一大堆例子说什么GC太初级,没有泛型之类,还有个装逼的叫王垠的go黑说什么go连语言都算不上,弄得好像广大无脑go黑都比Linux之父更懂编程语言设计,说得好像go只要出生就是严重残疾不消三秒就马上挂掉,结果呢?go一直发展到如今的1.4.1,开源社区红火一片,在生产环境也是历经重重考验虽表现不算完美但也十分出色,许多大公司也纷纷采用go作开发。当然脑残go黑们脸比城墙更厚这点程度的打脸是不疼的,这不又开始认了rust作干爹,嗯,如果rust再不给力那么go黑们又要开始新一轮的寻爹…想想都为脑残go黑们觉得累……
一切没有IDE的语言都是喳喳。
Brokedge
Brokedge

引用来自“MarshalChen”的评论

没有问题,不过我的技术解决栈是scala+ruby。

引用来自“anoyasha”的评论

scala怎么读?s ka la ? s kei la?。。。。。

引用来自“TimePower”的评论

se la ga?

引用来自“开源中国匿名会员”的评论

屎旮旯

引用来自“anoyasha”的评论

顺序都不对→_→

引用来自“开源中国匿名会员”的评论

哪里不对 s ca la 屎旮旯 c发浊音g
额貌似是我的顺序不对..........
jameszz
jameszz
说到Elixir,真心表示比较感兴趣,不知有谁用在线上系统吗?效果如何?我们有几个线上系统用的是Erlang, 但现在没人愿意维护,纷纷都用go了,但产品依赖的环境对Erlang支持最好,如果Elixir能替代,那真是好事情。
神州浪子
神州浪子

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈

引用来自“LeeRoBeRt”的评论

go吹 醒醒吧 google爹一向有抛弃自己作品的传统 半死不活dart, 废品gwt, 残次品angular 再到打肿脸充胖子的go 哪个能拿得出手?

引用来自“神州浪子”的评论

哟,开始抱rust的大腿啦?嗯 google没啥能拿出手,那咋还没倒闭呢?那咋业内一提到google就说是最伟大的公司呢?您拿出一个能拿出手的东西?拿不出来?废物就知道过嘴炮瘾

引用来自“LeeRoBeRt”的评论

哈哈 go吹那么快就怂了啊 又来你行你上啊这套逻辑了 我评论个冰箱还要自己会制冷啊?
是啊,从go的beta版开始就有脑残go黑开始说go不行,还举了一大堆例子说什么GC太初级,没有泛型之类,还有个装逼的叫王垠的go黑说什么go连语言都算不上,弄得好像广大无脑go黑都比Linux之父更懂编程语言设计,说得好像go只要出生就是严重残疾不消三秒就马上挂掉,结果呢?go一直发展到如今的1.4.1,开源社区红火一片,在生产环境也是历经重重考验虽表现不算完美但也十分出色,许多大公司也纷纷采用go作开发。当然脑残go黑们脸比城墙更厚这点程度的打脸是不疼的,这不又开始认了rust作干爹,嗯,如果rust再不给力那么go黑们又要开始新一轮的寻爹…想想都为脑残go黑们觉得累……
LeeRoBeRt
LeeRoBeRt

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈

引用来自“LeeRoBeRt”的评论

go吹 醒醒吧 google爹一向有抛弃自己作品的传统 半死不活dart, 废品gwt, 残次品angular 再到打肿脸充胖子的go 哪个能拿得出手?

引用来自“神州浪子”的评论

哟,开始抱rust的大腿啦?嗯 google没啥能拿出手,那咋还没倒闭呢?那咋业内一提到google就说是最伟大的公司呢?您拿出一个能拿出手的东西?拿不出来?废物就知道过嘴炮瘾
哈哈 go吹那么快就怂了啊 又来你行你上啊这套逻辑了 我评论个冰箱还要自己会制冷啊?
神州浪子
神州浪子

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈

引用来自“LeeRoBeRt”的评论

go吹 醒醒吧 google爹一向有抛弃自己作品的传统 半死不活dart, 废品gwt, 残次品angular 再到打肿脸充胖子的go 哪个能拿得出手?
哟,开始抱rust的大腿啦?嗯 google没啥能拿出手,那咋还没倒闭呢?那咋业内一提到google就说是最伟大的公司呢?您拿出一个能拿出手的东西?拿不出来?废物就知道过嘴炮瘾
LeeRoBeRt
LeeRoBeRt

引用来自“LeeRoBeRt”的评论

有Elixir了 请go不用操心了
请关心好自己 不要被rust取代了

引用来自“神州浪子”的评论

大白天能别说梦话么

引用来自“穿猫的靴子”的评论

2楼你在做梦么?

引用来自“神州浪子”的评论

到底谁在做梦?哈哈
国内最大go吹 许式伟 装逼写了一篇为啥用go而不是erlang 结果连最简单的常识都没搞明白 早就丢脸丢的一塌糊涂了 go吹们还好意思显摆
返回顶部
顶部