在生产环境中使用 Go 语言两年的总结
Garfielt, lidashuang · · 7102 次点击 · · 开始浏览在iron.io的生产环境使用Go语言两年后,我想分享我们的经验和感受。我们是第一批在生产环境中使用Go(Go语言)的公司之一,长久以来我们不知道该有怎样的预期,但到目前为止,很棒。
在之前发表的一篇文章从Ruby切换到Go中我谈了一些,但这次将更具细节一些,我们喜欢这门语言以及一路上我们学到的东西。介绍没有特定顺序,按下面这样:
- 性能表现(Performance)
- 内存占用(Memory)
- 并发性(Concurrency)
- 可靠性(Reliability)
- 部署(Deployment)
- 天赋(Talent)
Garfielt
翻译于 2年前
1人顶
翻译的不错哦!
性能表现
当我们第一次决定要使用什么语言时我们做了一些调研,为我们的应用环境、消息队列创建了一些模拟。我用Go写了我偏爱的beanstalkd的一个副本实现,使用beanstalkd协议,这样我可以使用现有的客户端测试。Go的表现的很好,几乎和官方的C语言版本一样(而且令人惊讶的容易写)。
你可以在电脑语言基准测试游戏网站找到Go和其他语言基准测试的比较。下面的图是和Java(Java可能是Go语言不存在时我们应该使用的语言)比较的结果:
Garfielt
翻译于 2年前
1人顶
翻译的不错哦!
内存占用
Go不需要加载虚拟机或解释程序,所以它启动快速和小巧。IronMQ启动时使用~ 6444 KB的内存,其中还包括加载配置、建立连接等。当它运行一段时间后,内存使用增加是因为它增加缓存等。现在,我们的生产服务器运行时内存占用在~400 MB(这个我认为无关紧要,这取决于你的应用程序)。
两年来,我们从来没遇到过内存泄漏或其他内存相关的问题。
并发性(Concurrency)
并发是Go很重要的一部分,但高层次的结构让使用起来很简单。我使用Java很多年了,使用java.util.concurrency包很舒服,这是一个很好的并发性的工具,但它在使用简易性和底层实现上不如Go。Go中使用Goroutines进行并发操作,使用channels在它们之间进行通信。Goroutines非常有趣:
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
"Goroutines是使并发易于使用的部分。这是个考虑了已经有一段时间的想法,是在一系列线程之上多路复用独立地执行的function—coroutine。当一个coroutine阻塞时,通过呼叫阻塞系统调用、运行环境自动切换到其他coroutine——到其他相同系统且可运行的线程,这样它们就不会堵塞。程序员不用接触这些操作,就是这一点。结果呢,就是我们所说的goroutines,它消耗很低:除非它花很多时间在耗时间的系统调用上,它消耗比基本堆栈更少的内存,只有几KB。为使堆栈更小,Go的运行环境采用分段栈。一个新创建的goroutine只分配几KB的内存,大多数情况下已经够用了。当内存不够用是,运行环境自动分配(释放)拓展的分段栈。上面是每个函数调用的三个基础指标的估值。在相同的地址空间创建个数百个goroutine是可行的。如果goroutine按线程概念的话,系统资源在一个更小的数就已经耗尽了。"参考
这里需要做的一件事是限制并发来确保在突发时我们的数据库或其他服务没有超载。我们使用Go通道的一个简单的信号实现。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
部署
Go 将所有的源码编译成单个的静态链接的文件,所以部署很简单,只要上传文件然后启动就可以,没有任何的依赖。没有运行时的依赖。不需要在服务器上安装Go。并且编译完的二进制很小,IronMQ二进制文件大约6MB
回滚
如果你部署完成后运行有问题并且你需要回滚到先前的程序,只要关闭错误的程序,重新运行先前的程序.程序编译成单个二进制文件后,不需要担心升级之后的依赖问题。
lidashuang
翻译于 2年前
1人顶
翻译的不错哦!
天赋
在我们冒了很大的风险选择Go的时候,Go并没有被很多数人所了解,听说过它的都很少。我们是第一个在Go语言爱好者邮件列表上发出Go招聘职位的公司,我们对申请人的应用质量吃了一惊。我们收到的职位申请中国,有一些使具有非凡经验的顶尖科技公司的开发者,有工作在某些核心项目的博士。大多数都不是使用Go做全时段编程,但在熟练Go和传递他们的经验和知识方面都很努力。我不确定我们试图建立的是否重要,但他们想用Go去工作。
我们第一个Go雇用者是一个Go的核心开发者, Evan Shaw,他现在一直和我们在一起。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
总结
经过两年使用Go工作后我可以自信地说,我们做了正确的选择。如果现在我们才开始iron.io的话,Go是想都不用想的选择。很多其他公司现在正在使用Go,包括Heroku,谷歌及和我说及过Go的人都有类似的意见。Rob Pike,一个Go的创造者的说:
"我们意识到我们在Google构建的软件使用我们已有的语言并不能完全如设想的提供服务"Pike在2011说。"Robert Griesemer、Ken Thompson和我决定创建一门语言来写谷歌需要的那类程序。 "Derek Collison, Apcera的创立者,近期在 Wired的文章上说:
"新技术的管理层和基础设施层提供了这种云交付模型?"他在Wired上这样说。"在两年之内,大部分将用Go来写。 "
Go是我们一直在等待的下一代语言吗?这一个点言之过早,但无疑是一个好的开始。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
在iron.io的生产环境使用Go语言两年后,我想分享我们的经验和感受。我们是第一批在生产环境中使用Go(Go语言)的公司之一,长久以来我们不知道该有怎样的预期,但到目前为止,很棒。
在之前发表的一篇文章从Ruby切换到Go中我谈了一些,但这次将更具细节一些,我们喜欢这门语言以及一路上我们学到的东西。介绍没有特定顺序,按下面这样:
- 性能表现(Performance)
- 内存占用(Memory)
- 并发性(Concurrency)
- 可靠性(Reliability)
- 部署(Deployment)
- 天赋(Talent)
Garfielt
翻译于 2年前
1人顶
翻译的不错哦!
性能表现
当我们第一次决定要使用什么语言时我们做了一些调研,为我们的应用环境、消息队列创建了一些模拟。我用Go写了我偏爱的beanstalkd的一个副本实现,使用beanstalkd协议,这样我可以使用现有的客户端测试。Go的表现的很好,几乎和官方的C语言版本一样(而且令人惊讶的容易写)。
你可以在电脑语言基准测试游戏网站找到Go和其他语言基准测试的比较。下面的图是和Java(Java可能是Go语言不存在时我们应该使用的语言)比较的结果:
Garfielt
翻译于 2年前
1人顶
翻译的不错哦!
内存占用
Go不需要加载虚拟机或解释程序,所以它启动快速和小巧。IronMQ启动时使用~ 6444 KB的内存,其中还包括加载配置、建立连接等。当它运行一段时间后,内存使用增加是因为它增加缓存等。现在,我们的生产服务器运行时内存占用在~400 MB(这个我认为无关紧要,这取决于你的应用程序)。
两年来,我们从来没遇到过内存泄漏或其他内存相关的问题。
并发性(Concurrency)
并发是Go很重要的一部分,但高层次的结构让使用起来很简单。我使用Java很多年了,使用java.util.concurrency包很舒服,这是一个很好的并发性的工具,但它在使用简易性和底层实现上不如Go。Go中使用Goroutines进行并发操作,使用channels在它们之间进行通信。Goroutines非常有趣:
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
"Goroutines是使并发易于使用的部分。这是个考虑了已经有一段时间的想法,是在一系列线程之上多路复用独立地执行的function—coroutine。当一个coroutine阻塞时,通过呼叫阻塞系统调用、运行环境自动切换到其他coroutine——到其他相同系统且可运行的线程,这样它们就不会堵塞。程序员不用接触这些操作,就是这一点。结果呢,就是我们所说的goroutines,它消耗很低:除非它花很多时间在耗时间的系统调用上,它消耗比基本堆栈更少的内存,只有几KB。为使堆栈更小,Go的运行环境采用分段栈。一个新创建的goroutine只分配几KB的内存,大多数情况下已经够用了。当内存不够用是,运行环境自动分配(释放)拓展的分段栈。上面是每个函数调用的三个基础指标的估值。在相同的地址空间创建个数百个goroutine是可行的。如果goroutine按线程概念的话,系统资源在一个更小的数就已经耗尽了。"参考
这里需要做的一件事是限制并发来确保在突发时我们的数据库或其他服务没有超载。我们使用Go通道的一个简单的信号实现。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
部署
Go 将所有的源码编译成单个的静态链接的文件,所以部署很简单,只要上传文件然后启动就可以,没有任何的依赖。没有运行时的依赖。不需要在服务器上安装Go。并且编译完的二进制很小,IronMQ二进制文件大约6MB
回滚
如果你部署完成后运行有问题并且你需要回滚到先前的程序,只要关闭错误的程序,重新运行先前的程序.程序编译成单个二进制文件后,不需要担心升级之后的依赖问题。
lidashuang
翻译于 2年前
1人顶
翻译的不错哦!
天赋
在我们冒了很大的风险选择Go的时候,Go并没有被很多数人所了解,听说过它的都很少。我们是第一个在Go语言爱好者邮件列表上发出Go招聘职位的公司,我们对申请人的应用质量吃了一惊。我们收到的职位申请中国,有一些使具有非凡经验的顶尖科技公司的开发者,有工作在某些核心项目的博士。大多数都不是使用Go做全时段编程,但在熟练Go和传递他们的经验和知识方面都很努力。我不确定我们试图建立的是否重要,但他们想用Go去工作。
我们第一个Go雇用者是一个Go的核心开发者, Evan Shaw,他现在一直和我们在一起。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
总结
经过两年使用Go工作后我可以自信地说,我们做了正确的选择。如果现在我们才开始iron.io的话,Go是想都不用想的选择。很多其他公司现在正在使用Go,包括Heroku,谷歌及和我说及过Go的人都有类似的意见。Rob Pike,一个Go的创造者的说:
"我们意识到我们在Google构建的软件使用我们已有的语言并不能完全如设想的提供服务"Pike在2011说。"Robert Griesemer、Ken Thompson和我决定创建一门语言来写谷歌需要的那类程序。 "Derek Collison, Apcera的创立者,近期在 Wired的文章上说:
"新技术的管理层和基础设施层提供了这种云交付模型?"他在Wired上这样说。"在两年之内,大部分将用Go来写。 "
Go是我们一直在等待的下一代语言吗?这一个点言之过早,但无疑是一个好的开始。
Garfielt
翻译于 2年前
0人顶
翻译的不错哦!
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们