使用Go语言来提升Ruby应用的性能

开发 前端 后端
本文着重于阐述能够引领你在ruby应用程序中使用Go的理由。并且会深入细节,我会提供我的启动项目Firmapi的源代码。

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

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

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

1.低成本且易用的并发

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

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

2. 低内存开销

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

3. 易于部署

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

连通 Go 和 Ruby

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

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

1.  Go 方面

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

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

2.  Ruby 方面

Ruby 代码则可精简到一行 :

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

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

怎么组织代码?

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

部署

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

结论

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

英文原文:Using Go to improve your Ruby application's performance

责任编辑:林师授 来源: 开源中国社区编译
相关推荐

2023-12-26 00:58:53

Web应用Go语言

2013-05-22 09:38:03

GoGo语言Go性能

2023-11-06 08:01:09

Go同步异步

2014-07-04 09:58:15

gemsRails

2023-11-07 11:11:42

Go性能

2023-01-16 00:12:20

Go语言Web

2022-08-30 10:58:45

ViteEsbuild前端

2010-03-03 15:46:40

Android应用程序

2009-10-05 09:46:12

编程语言排行榜Ruby

2012-11-07 09:41:30

2023-12-30 18:35:37

Go识别应用程序

2020-12-28 12:06:42

Ruby 3编程语言优化

2023-05-12 13:21:12

JMHJava程序

2011-10-14 14:24:26

Ruby

2016-09-26 13:50:52

Linux系统性能

2021-09-27 09:52:41

FacebookBOLTLinux

2024-02-26 00:02:00

开发Go

2020-12-03 08:00:00

SQL数据库MySQL

2014-11-05 20:05:46

dockerJenkins

2021-09-27 08:16:38

Webpack 前端Cache
点赞
收藏

51CTO技术栈公众号