说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Timehop为什么要放弃Rails,转向Go?

HTML文档下载 WORD文档下载 PDF文档下载
流行的社交应用Timehop(时光机)能帮助人们回忆起过去某天自己在不同社交媒体上的足迹,自上线以来用户规模不断扩大。Timehop的开发平台经历了从Rails迁移到Go的转变,这其中有什么原因呢?

【编者按】去年,Express.js库作者TJ Holowaychuk由Node.js转向Go语言,并发表一篇文章,对这两门语言进行了对比。现在,又有越来越多的平台转向Go进行开发,例如,CSDN研发频道去年发表的Bowery为什么放弃Node.js,转向Go?那么,此次Timehop又为什么放弃Rails,转向Go呢?


以下为相关译文:

流行的社交应用Timehop(时光机)能帮助人们回忆起过去某天自己在不同社交媒体上的足迹,自上线以来用户规模不断扩大。Timehop的开发平台经历了从Rails迁移到Go的转变,这其中有什么原因呢?

自把Timehop迁移到Go已经差不多一年半了,其中95%的请求的响应时间从Rails时代的700ms减少到70ms,每天活跃用户数为600万。接下来我会总结本次Go迁移过程中的体会与心得,希望能让大家更好地认识Go语言。

为什么选择Go?

运作初期,Timehop是运行在Rails之上的。但随着用户数和访问量的快速增长,Rails渐渐地出现了瓶颈问题。我们很多请求都是需要并行处理的。当用户启动Timehop后,我们需要收集用户在过去的全部社交数据。而不同平台的数据查询都是相互独立的,所以并行处理是高频事件。我们也曾试图与Ruby相结合来做,但效果不理想,因为Ruby不是真正的多线程处理系统。

有鉴于此,我们列出了三个新平台最需要解决的问题:

  1. 能便捷进行并行处理
  2. 真正的多线程系统
  3. 高性能

为什么Go能脱颖而出?

除了Ruby,Node.js也曾经进入我们的视野。但最终我们坚定选择了Go:

  • 性能:Go代码会被编译为机器代码,编译后的程序运行速度可与C/C++媲美,并且无需额外的虚拟机和解析器;
  • 静态编写:计算机能掌握所有的编写错误而我们不能。为什么不依赖计算机来处理呢?
  • 稳健直接的并行处理:Go程序和管道使得并行代码可读性高、条理清晰。同时也使并行代码更加安全而无须显式锁,此外也不用担心出现回调错乱。

随着迁移工作的进行,我们还发现了更多的优点:

  • 十分简便的部署工作——编译Go程序时,程序本身及所有程序依赖都会被统一编译为单一个二进制文件;
  • 丰富的配套工具——例如代码格式工具“go fmt”,能帮助开发者消除代码格式不统一的问题。此外Go还有很多强大的工具;
  • 丰富的标准库——使用Go后,很多第三的库都不再需要了。

可见Go十分符合我们之前提出的三点要求,所以我们最后选择了它。但同时,团队里也曾就Go语言进行过讨论,现整理如下。

使用Go后会出现意外吗?

迁移时我们最怕的是影响程序代码的生产力。之前使用Ruby编码时,速度是非常快的。但是使用之后,发现Go不但没有影响编写速度,同时更加稳健,能帮助减少很多输入错误。编译速度也令人满意,我们最大的一个Go项目至多用时2.5s就能完成。

如何完成团队的技术切换?

结合个人体会,我发表过一篇入门文章供团队阅读。此外,Go教程高效Go,Go官网的标准库都是很好的教材。

Go有弱点

对程序依赖的管理。Go提供了一个便捷的导入方法,能以基于路径的方式进行包导入。例如:

import “github.com/timehop/golog/log”

你可以使用go get命令来运行。但虽然是方便,如果有其它人改变了路径或提供的API出现变更,那么可能会造成未知的部署错误。因此我们建议使用部署工具Godep来对程序依赖进行管理。

部署时有哪些关键的库需要注意?

我们曾试图搜索Go on Rails的信息,但一无所获。目前,我们使用得最多的是标准net/http库,以及Gorilla的mux。这也是目前主流的处理方式。

如何进行托管?如何进行部署?

刚开始是托管在与Rails相同的Heroku之上,使用Go buildback进行部署。后来迁移到EC2,部署工作也一样轻松。一如前述,Go程序最终都是一个编译好的二进制文件。

我们目前的流程是:

1.  把代码上传到Github;

2.  使用Travis进行测试;

3.  如果通过,进行编译,压缩,然后上传到S3。

进行部署时,从S3下载tar文件,解压缩,然后运行。(使用的是Chef)

能使用Go语言创建APIs吗?

可以的。比方说,一个User结构体:

type User struct {  FirstName string `json:"first_name"`  LastName string `json:"last_name"`  Password string `json:"-"`}

用户信息项之后的标签定义了如何进行JSON序列化。

如果要输出一个用户实例,可以简单地编写为:

u := User{FirstName: "Abe", LastName: "Dino", Password: "p4ssw0rd"}jsonBytes, _ := json.Marshal(u)

Go程序在多态性和模块化方面是如何处理的?

Go不是面向对象的语言,没有任何的类型分层。同时不存在继承,能自由地进行进行类包含,从而实现多态和代码复用。

另外Go的界面是非常友好的。不同于其它语言需要显式地进行类声明,在Go中一个简单的结构体就可以了。我们觉得这是它最强大的特性之一,具体原因可以参考这里。

Google的支援有多重要?

能持续得到Google的帮助与投入,对于Go语言无疑是一大福音。其社区规模也不断扩大,从而出现了很多高质素的开源项目与参考资源。

写在最后

我们希望本文对Go语言感兴趣的团队有所帮助。要想很好地使用新平台是需要下一番功夫的,不妨与团队成员一起多做多思考多讨论,从而确保项目顺利进行。

英文来自:Medium

Ruby 2.2.0发布,支持回收Symbol类型对象 听UnitedStack、IBM、HP专家如何谈“OpenStack 存储”技术 专访POWER 8编程挑战赛选手孙冬冬:从C语言到人工智能、深度学习的技术演变 盘点2014:十家最酷的大数据创业公司 盘点2014:最受关注的十大云服务创业公司 我想学phplib,大家给我推荐些好的资源吧! 求xml的基础教程 高分求关于网站UML设计的例子,可以分享一下么?分不够再加 谢谢大家帮我出出主意!谢谢! 怎么使用bitBlt进行操作 各位老大帮帮忙啊,在线等候 jb9和jboss3配置问题-在线等(50分不够可加) 表间数据转移,大家看看,谢谢! 高手救命 汉字五行属木的字有哪些 陋室铭和爱莲说用到了哪些写作手法?(除了托物言志) 五行中属木的字,都有什么字? 以“感恩父母;感动中国;感悟生活;”为话题作文不要 同性恋现在中国能结婚吗.现在是2010年,我们14 把《江畔独步寻花》改写成一段写景的文字.要自己想出 补全有关团结合作的谚语名言.1.孤雁难飞( ).2 急求一片关于中国历史耻辱惨痛教训的论文,1000字 高分求中国历史文化1000字论文?可以谈论中国历史 英国10月份制造业PMI回落至56.今年全国平均雾霾日数为4.7天 系5河南新乡“失误”审批百亩别墅 五责任云南泸西爆炸枪击案两主犯伏法日本外相将于明年春季访俄 就签署和约侨乡福州涉侨空巢老人多 养老服务业现猎豹浏览器皮肤大赛揭晓 特等奖10万揭秘神奇的印度\"饭盒人\" 晚点几英租房巨头称不再接受补贴租户 更欢迎央视马年春晚主持阵容确定志破青天魔纹师天禁八荒七封金柜虫阴元石旅游泸山旅游观日台旅游祖师殿旅游半山亭旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘