Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39201
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 275
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-20 20:38
个人简介

本人从事SEO

文章分类

全部博文(26)

文章存档

2015年(25)

2014年(1)

我的朋友

分类: IT职场

2015-04-15 16:29:17

    在SoundCloud,我们为客户构建了产品的API。或者说,我们主要的网站、手机客户端和手机应用是该API的第一批客户。该API背后是一个领域性的服务:SoundCloud基本上以面向服务体系结构的形式运作。


    我们也是通晓多种语言的组织,因为我们使用了很多语言。并且这些服务(和基础设施支持)的许多部分是使用Golang开发的。事实上,我们都是早期Golang的使用者:目前,我们已在产品中使用Golang有两年半的时间。相关项目包括:


    Bazooka,我们内部服务平台;产品思想非常类似于Keroku或Flynn。


    我们外围的传输层使用通用的nginx, HAProxy等等,但是它们要和Golang服务协作。


    我们的音频存储在AWS S3上,但是上传、转码和生成链接等需要Golang服务协调处理。


    搜索采用了Elasticsearch, 探测使用复杂的机器学习模型,但是它们都与由Golang开发的基础设施相集成。


    Prometheus,一个早期阶段的遥测系统纯粹是有Golang开发。


    当前,流处理采用Cassandra,但是我们正打算(几乎)完全使用Golang代替。


    我们也正在试验用Golnag开发的HTTP流媒体直播服务。


    许多其他面向产品的小服务。


    这些项目大概有六个团队开发,包括十多人的SoundCloud勤杂工,他们中的大部分会全职使用Golang。毕竟在这个时候,这些项目和这样混杂的工程师中,我们已经逐渐形成了在产品中使用Golang的最好实践方法。我们的这些教训将对其他开始大举投资Golang的组织提供帮助。


    开发环境


    在我们的笔记本上,我们已经设定了单一、全局的GOPATH。就个人而言,我喜欢使用$HOME,但是许多其他人使用$HOME下的一个子目录。我们克隆仓库进入GOPATH的相对路径,然后就可直接工作。即,


    $ mkdir -p $GOPATH/src/github.com/soundcloud


    $ cd $GOPATH/src/github.com/soundcloud


    $ git clone git@github.com:soundcloud/roshi


    我们中的许多人在早期一直和约定俗成的事情做斗争,以保持我们自己特有的代码组织方法。事实上,它根本不值得如此麻烦。


    对于编辑器,许多用户使用Vim以及各种插件。(我使用的vim-go就不错。)还有许多人,包括我自己也是,结合GoSublime使用Sublime Text。也有少数人使用Emacs,但没有人用IDE。我不确定这是不是个最佳的实践,但标出来挺有趣的。


    库结构


    我们的最佳实践是确保任何事情简单。许多服务源码半打包在main包中。


    github.com/soundcloud/simple/


    README.md


    Makefile


    main.go


    main_test.go


    support.go


    support_test.go


    比如我们的搜索调度器,两年后仍然是这样。在确定需要前不要创建新结构。


    也许在某些时候你需要创建一个新的支持包。在你的main库中使用子目录,并使用完整的限定名导入。如果该包只有一个文件或一个结构,那么它肯定不需要分拆出来。


    有时一个仓库中需要包含多个二进制文件;比如这个任务需要一个服务,一个工作进程,或一个监控。在这种情况下,将每个二进制文件放在特定main包的单独的子目录中,并使用其他的子目录(或包)来实现共享的功能。


    github.com/soundcloud/complex/


    README.md


    Makefile


    complex-server/


    main.go


    main_test.go


    handlers.go


    handlers_test.go


    complex-worker/


    main.go


    main_test.go


    process.go


    process_test.go


    shared/


    foo.go


    foo_test.go


    bar.go


    bar_test.go


    请注意,不要引入asrc目录。由于vendor子目录异常(下面介绍更多内容)不要在仓库中包含src目录,或将其添加到GOPATH。


      
阅读(372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~