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

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

Windows 8引领智能操作 人机交互进入触控时代 豌豆荚发布新版应用搜索 推出“绿色标签”机制 权威解读:苹果的未来将走向何方? Google炮轰Facebook:你们的社交已经过时了! iOS设备硬件规格完整汇总 2012 MDCC“2012移动互联网应用创新大赛与开发者面对面”专场:创所未享,携手逐梦! RIM携QNX为“2012 BlackBerry平台移动应用高校竞赛” 颁奖 BlackBerry 10 策略:用金钱吸引游戏开发者 黑莓10要来了:RIM正式开放应用提交 从RIM与微软达成exFAT授权所想到的 OpenStack中国行来到南京 中兴通讯分享电信行业应用 CSS架构目标:预测、重用、扩展、维护 黑客利用移动浏览器漏洞窃取云计算资源 地位动摇:Windows设备10月销量同比下滑21% 手机QQ浏览器4.0 Android版 极速快感 生存还是毁灭:Facebook惨败真是HTML5的错? OpenStack基金会主席:一年后成熟度超越CloudStack 在线学习新编程 技巧全攻略 “英特尔杯”HTML5程序开发邀请赛侧记 C#编译器组首席工程师Eric Lippert离职 加盟Coverity Testacular:Google开源的JavaScript测试执行过程管理工具 黑莓亚洲开发者大会报道:BB10将敲开亚洲应用市场大门 挑战Google!传Facebook与Yahoo要联手开发搜索引擎 揭秘Android 4.2 开发者的天堂与地狱 11大黄金法则:顶级移动UX设计心髓 库克时代:苹果已经不是苹果 设计师必备:极简风格的Fluid UI快速原型图工具 iPhone 5发布,后乔布斯时代苹果乏善可陈 牛人妙计:HTML5应用也能像原生一样跑得快 移动周报:OpenFeint难逃关闭命运 细数与苹果恩怨史 FlyingDaggers团队专访:不浮躁,用心做真正的原创游戏! 菜鸟有问题,Win2k的定时关机程序 关于天数累加的问题 webbrowser控件问题? 421连续进纸标准,打印问题,难啊,难 有个小问题难住偶了! 请教 bdf 文件的格式 在JPrint中如何设置页面的打印范围(不使用打印机的默认打印范围),找不到例子,那位能够给个实例。。。 开发jsp需要什么环境和安装软件,目前版本为多少? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 怎么回事。formshow 不能写太多sql语句么〉?,怎么不显示?大家快帮看看,急死了 自动累加的问题?(100)我只能给这么多了 哪里可以下载powerbuilder7.0 网页自动累加的问题(100) help 求肋!! 有关SUN WORKSTATION OPENBOOT的问题 请问一下vb6和.NET 请问,如何用flash 做一个网页“访问量统计”计数器? 请问在win98繁体下开发的pb源程序,在简体win98下怎样转过来?急,请帮忙! 手提电脑,没有软驱,现有一外置USB软驱,但是找不到光盘驱动, 谁有用vb开发组件的详细文档资料或教程 关闭窗口的问题!! 欢迎有志向的VB程序员加入到我的团队!!! 大家做Web Service的时候,是使用SqlDataAdapter这类控件 ,还是自己写SQL语句访问,还是自己写数据访问中间件(e.g:dll),那个在生产环境 webbrowser问题 hello 请问我的servlet程序应该放在哪里?我使用tomcat 欢迎有志向的VB程序员加入到我的团队!!! 有没有当网管的兄弟啊,交流一下 在IE设置为缺省的情况下,怎么用ActiveX? 急!急!100分问题求解(不够可加)输入中文到oracle数据库乱码的问题 请教一个小问题:通常自己定义的ID在那里定义好?也放在Resource.h里面吗? pascal求问 请问有谁知道哪里有水晶报表的中文教材? 这个问题我很头疼,大家能否帮帮忙? pascal 哪位大虾告诉我哪里可以下载bc3.1的编译器 怎么样在mts object代码中使用计时器?类似TTimer.onTime哪样 请问如何在对话框中,设定单选的默认值? 在PASCAL语言中的"集合"概念,如何转化成C语言表示 探讨数据库设计的最实际的原则!高手新手都请进!! ActiveSkin 的问题,知道的人来捡分啊!:) VB可以写COM? 高分求教:怎样用DX Show将获得压缩卡的压缩流? 如何用VB来做聊天室刷屏软件 请高手指点图片显示问题!!! 在access数据库中用insert插入记录时如何处理“自动增长”字段? 这个问题我很头疼,大家能否帮帮忙? 请教有关VCL方面的好书! 关于fso的问题 BUG 应用程序为什么只闪一下就没了? 连接圆上任意两点的线段中,最长的是直径对还是错原因 现在陆地上最大的动物是什么? 有一群羊,既有山羊又有绵羊,其中山羊占45%,再加入32只绵羊后,山羊就只占25%,求山羊用分部计算来解不能用比 1张A4纸是多大面积 饲养场养了80只羊,其中山羊是绵羊的4倍,山羊和绵羊各有多少只 解释拱形受力的特点 两端都在圆上的线段,直径最长是对是错两端都在圆上的线段,直径最长是对是急用 农村养山羊还是养绵羊好农村养绵羊和山羊哪个赚钱?哪个好养?网上都说山羊赚钱,好养,但有养的邻居说山羊跑起来追不上?他们晚上爱叫吗?是秋后才能买羊吗 陆地上最高的哺乳动物是什么? 一包A4纸共100张,售价18元,照这样计算,每张A4纸合多少元钱?还有:如果1千克小麦可以磨面粉0.85千克,那么100千克、1000千克小麦可以磨面粉多少千克? 山羊和绵羊比哪个好养 拱形受力分析,一个拱形受到垂直向下的力, 物理25页,汽车不在拱形桥的最高点或凹形桥的最低点时能不能用上诉方法求解.25页,汽车不在拱形桥的最高点或凹形桥的最低点时能不能用上诉方法求解.物理书第25页上的 ,汽车过桥,在桥中间 自行车后轮与地面没有相对运动,只有相对运动趋势?请不要偏题 英国人和美国人区别大吗?为什么英国人去了美国,他们美国人一般能分辨看的出来他不是美国人就应该是英国人,英国人和美国人外貌跟口音都有差别不同吗?如果美国人去英国,他们英国人都 有一群羊,既有山羊又有绵羊,其中山羊占45%,再加入32只绵羊后,山羊就只占25%, 养山羊好还是绵羊好? 一条直线把一个圆分成面积比为2:3两部分,求这条弦所对的圆心角,帮我算一下, 小尾寒羊是山羊还是绵羊?养山羊赚钱还是绵羊赚钱? 为什么当自行车启动,在链条驱动下,后轮逆时针转动,轮胎与地面接触处相对于地面有向后运动的趋势求高手详解啊!最好有图 英国人和美国人的不同是哪些啊?这两个国家都讲的是同一种语言.虽然美国的是美式英语但也只不过是口音有点不同.是不是英国的人比较绅士气度啊?你觉得是怎么样啊? 怎么分析小车过拱形桥 现在山羊好养还是绵羊好养 一条直线把一个圆分成面积比为3:7两部分,求这条弦所对的圆心角,帮我算一下, 汽车不在拱形桥的最低点和最高点的运动怎样分析?请具体的解释为什么最高点不考虑牵引力? 陆地上奔跑速度最快的动物是什么? 美国人与英国人的区别性格的区别 高EQ是什么意思 各种动物的奔跑速度 美国人英国人:口音为什么会不同? 情商太低是什么意思. 什么是奔跑速度最快的动物 汽车和摩托车行驶中的加速、山羊和绵羊产生的DNA杂交,产生一种特殊的动物---绵山羊、风力发电机把风能转化为电能分别属于什么研究()A、物理研究.B、生物学研究.C、化学研究 喜羊羊究竟是山羊还是绵羊?为什么有的外文翻译是Pleasent Goat?山羊和绵羊有什么区别? 判断 1.半径就是从圆心到圆上任意一点的线段.( ) 2.π等于圆的周长与直径的比值.( )3.轴对称图形沿对称轴对折,两侧的图形完全重合.( ) 藏绵羊,藏山羊,野骆驼是可可西里的典型动物吗? 属羊是山羊还是绵羊 d.连接圆心到圆上任意一点的线段叫做(直径 ),在同一个圆里,直径的长度是半径的(2倍 ),半径长度是直 【高中物理】受力分析的题目》》》如图所示:一曲柄压榨机的示意图,其中O为固定铰链,杆OA与AB等长.在压榨机铰链A处作用的水平力为F,OB是铅垂线.如果杆和活塞的重力忽略不计,在已知角x的 一辆汽车通过拱桥顶端速度10m/s,车对桥压力是车重力的3/4,要使汽车通过顶点对桥面没有压力,车速至少为?怎么出来的? 线段AB长2cm,图中的圆是以A点为圆心,1.5厘米长为半径的圆.(1)画出和B点相距1.5cm的所有点(2)找出A点、B点都相距1.5cm的点,并依次标上C、D、E、、、、、、、、、、 汉语中的羊包括山羊吗?网上介绍说羊主要指绵羊,有无动物专家解释一下?我们国家的十二生肖里的羊是山羊还是绵羊呢? 汽车过凹桥质量为m的汽车在凹桥上以速度v前进,桥面的圆弧半径为 r,重力加速度为g.求:汽车通过桥的最低点时对桥面的压力F.并讨论若速度增大会发生什么情况? 有一群羊,既有山羊又有绵羊,山羊占45%,再加入32只绵羊后,山羊就只占25%.原山羊多少只? 请各位大虾看下我做得对不对,如果错了,并我帮纠正错误,感激不尽 克隆羊“多利”是哪只羊的名字?是被克隆的那一只羊还是克隆出来的那只羊? 求拱形桥建造物理原理 山羊的7/1和绵羊的8/1相同,山羊和绵羊比较, 山羊160只,绵羊比山羊多40只,山羊比绵羊少( )%,绵羊比山羊多( )% 通过圆心的线段叫直径吗? 把一根长6.28的铁丝围成一个圆 这个圆的直径( ) 面积是( ) 属于哺乳类的动物有哪些?10个以上! 有一群羊,山羊占45%,再加入32只绵羊,山羊就只占25%.请问这群羊中山羊有几只? 一根铁丝恰好可以围成一个边长6.28米的正方形,如果用这根铁丝改围成一个圆,这个圆的直径是多少米? 哺乳类动物有哪些?急用! 解释拱形受力特点 判断对错:有一根铁丝围成一个边长是6.28分米的正方形,如果把它改围成一个圆,那么圆的直径是2分米 一个判断题 圆上两点之间最长的线段一定是直径 通过圆心的线段叫直径是对的吗? 一根绳子用去1/5,正好是6.28米,用剩下的绳子围成一个圆,圆的面积是多少
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘