Timehop为什么使用Go语言替代Rails?

15-02-28 banq
              

Timehop是一家帮用户“时光旅行”的创业公司,他们在生产环境使用Go语言已经超过一年半了,网站平均响应时间从Rails的700毫秒降低到70毫秒,每天服务6百万独立用户访问量。

这是来自博文Why Timehop Chose Go to Replace Our Rails App — Bu

起初,他们建立Timehop时像其他创业公司一样使用Rails,业务增长得出奇得快,Rails应用已经跟不上。

他们做的很多事情应该可以并行化的,当用户打开应用,Timehop会收集这些年来用户的内容,独立地查询数据库,这种查询非常容易并行化,他们试图使用Ruby实现,但是最终,Ruby因为没有真正多线程,限制了相关抽象的正常工作且脆弱。

考虑新的语言时要求是:易并发 真正并行 且高性能。

他们还比较了Go与Node.js等语言,但是Go有如下主要三个优点:

1.性能 --Go代码编译成机器代码,没有VM和解释器等附加负担。

2.静态类型

3.理智的可读的并发 --Goroutine和channel使得并发容易且易于阅读,不需要显式的锁就可以实现安全的并发。没有Node.js的回调陷阱。

其他优点还有:

1.超级简单的部署,编译到一个二进制文件,包括所有依赖。

2.惊奇的工具链,拥有很多工具,包括代码格式化工具 go fmt。

3.非常健壮的标准库。

他们在进行切换时还是有担心的,Ruby到底是一个非常富有表现力的编程语言,能够快速地编写代码,切换到静态编译语言后担心丢失这些优点。

切换以后发现这些担心是多余的,编写代码一样快,而且更安全,Go的类型安全可以防止大量低级错误,这些常在Ruby中普遍出现。

编译代码也不是问题,最大的Go应用最坏情况只需要2.5秒。

那么Go有什么弱点呢?

依赖管理是其弱点。

Go能够方便的import导入包,你只需要简单的go get命令拉取库包。依赖管理工具是Godep,它会将所有依赖拉取到你的项目,基本上是复制到你的项目,你总是会有一个依赖包的工作副本。

这是Go创建者的特别设计,为了避免像其他语言一样建立一个依赖系统(如Java的Maven)。

他们使用 net/http 库巴和 and Gorilla的mux实现路由构建JSON API。其他框架见这里

最终他们迁移到亚马逊的EC2,部署非常容易。

Go编写API非常简单,比如一个User的struct如下:

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

这将被序列化成JSON,不需要特别的序列化定制,输出语句:

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

Go语言并不是一个面向对象语言,它没有类型层次,鼓励使用组合替代继承。它有非常棒的接口系统...

              

1