QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Dropbox 公司的 Go 语言探索之路

  • 2017-07-24
  • 本文字数:2088 字

    阅读完需:约 7 分钟

Tammy 援引 Rob Pike 于 2012 年撰写的《谷歌 Go 语言:专为软件工程服务设计的编程语言》中的说法,解释了 Go 语言为何能够在 Dropbox 公司当中发挥重要作用:

“Go 语言高效、可扩展且极具生产能力。一部分程序员乐于加以运用,但也有一些人认为其难以理解甚至非常无聊。在这篇文章中,我们将解释为什么这些立场本身并不矛盾。Go 语言旨在帮助谷歌公司解决其在软件开发方面面临的各类问题,这意味着其尽管不能算是一种突破性的研究型语言,但仍然成为大型软件工程项目当中的出色工具。” — Rob Pike, 2012

Dropbox 公司拥有庞大的业务规模:

  • 超过 5 亿名用户;
  • 20 万商业客户;
  • 500 PB 用户数据;
  • 数据 EB GO 存储系统。

正因为如此,Dropbox 公司对自身系统、语言以及工程师提出了极高要求。其指导原则与要求包括:

  • 构建高可靠性系统;
  • 构建安全系统;
  • 将可靠性与安全性纳入初始设计;
  • 可靠性需要达到 99.9999999999% (12 个 9);
  • 可用性需要达到 99.99%。

Dropbox公司对Go**** 语言的应用

目前,Dropbox 公司的大部分基础设施以 Go 语言编写而成,具体包括:

  • Go 服务器库拥有 150 名贡献者(来自总计 500 名工程师);
  • Dropbox 公司内超过 15 个团队负责构建及运行 Go 服务;
  • Dropbox 公司内部拥有 130 万行 Go 代码;

另有一部分关键性系统亦由 Go 语言编写而成:

  • RAT: 限速与限流工具。
  • HAT: memcached 的替代方案。
  • AFS: 一套用于替代全局 Zookeeper 的文件系统。
  • Edgestore: 分布式数据库。
  • Bolt: 用于消息收发。
  • DBmanager: 用于对 Dropbox 内超过 6000 套数据库进行自动化管理与监控。
  • “Jetstream”、“Telescope” 、分块路由以及更多……

其中相当一部分都继承自原本的非 Go 系统。

Dropbox**** 公司当初为何选择使用 Go?

Tammy 亦分享了 Dropbox 公司一步步增加 Go 语言使用量的轶闻趣事。

Hack技术周成就Go**** 速率限制器原型设计

在某一年的 Hack 技术周之前,Dropbox 的工程师们计划针对各项服务分别进行限速与限流。因此,一位工程师决定在接下来的 Hack 技术周内构建一项通用服务以实现上述目标——而 RAT 也就此诞生。

RAT 的初始原型设计在 4 天之内即构建完成,并在第 5 天发布了演示。短短几周之后,RAT 的大名在公司内部迅速扩散。另一位 Dropbox 工程师通过电子邮件与 Tammy 团队取得了联系,希望了解其如何在 Python 项目当中使用 RAT。整个整合进程进展顺利,RAT 的采用率不断提高,实用性也快速增强。目前,Dropbox 公司内已经有多个团队在使用 RAT。

DBmanager

Dropbox 公司拥有超过 6000 套数据库,这样的大型系统自然需要自动化管理与监控措施与之配合。事实上,这些数据库随时随地都在进行复制、故障转移以及通过副本进行主体升级等等。

为了管理这一切,Dropbox 公司的一名工程师开发出 DBmanager——这是一套 Web UI,能够帮助管理员快速查看全部 6000 多套数据库中发生的状况。另外,其还能够将状态信息发布至其它系统。

Dropbox公司中的Go**** 版本升级之路

在数百名工程师的配合下,Dropbox 公司小心翼翼地协调着 Go 语言各主要版本的升级工作。不过 Tammy 并没有提到任何由升级带来的问题,这表明整个过程应该相当顺利!

下面来看一些有趣的事实:

  • Dropbox 公司最近刚刚完成生产服务当中由 Go 1.5 到 1.6 版本的升级;
  • 为了追踪升级流程,工作人员创建了一份简单的 Dropbox Paper 文档,同时要求每位服务。

持有者报告进度并在必要时申请帮助。

Dropbox 公司决定在 1.6 版本迁移完成之后(包括各非生产服务),跳过 Go 1.7 并直接升级至 1.8 版本。

Dropbox公司如何引导新晋工程师们使用Go**** 语言

每一位 Dropbox 工程师都需要经历同样严格的 Go 语言培训流程,具体包括:

  • 阅读基础设施拓扑资料、Go 语言风格指南以及 Protobuf 风格指南。
  • 严格但友好的代码审查。
  • 利用 Go 语言构建一款娱乐性质的应用程序(一套应用商店)。
  • 学习利用 Bazel 构建并测试 Go 代码。

经验丰富的工程师大约需要一周时间以完成上述培训。

Go语言为Dropbox**** 公司带来哪些收益?又存在哪些不足?

总体而言,Dropbox 公司的 Go 应用之路非常成功。

  • 易于在 Go 语言环境下进行生产。
  • 易于在 Go 语言环境下编写并消费服务。(人们也热衷于此!)
  • Go 语言标准库非常出色。
  • 调试工具(总体上)运作良好。

其中的关键在于,Dropbox 公司并没有费力将 Go 编写成的服务重写为其它语言版本,这表明人们对其相当满意。(有趣的是,Tammy 表示 Dropbox 公司也在部分使用 Rust,但其并不属于 Go 的替代品。)

Dropbox公司在使用Go**** 语言时遇到哪些困难?

Tammy 证实称,Go 语言最大的问题在于处理竞态条件。

  • 数据竞态类 bug 给调试、查询与修复等工作带来挑战。
  • 一部分 Dropbox 工程师特别擅长处理 Go 语言的查询机制,而另一部分工程师则选择发挥自己的专长。
  • Go 数据竞态检测器有时候不起作用。确定这种不起作用的情况非常重要。
  • 必须以审慎的态度设计需要对数据进行并发访问的 Go 程序。

Dropbox 公司重视工程师对于可靠性及持久性的关注度,因此他们亦应当有能力解决上述问题(事实上,这种并发处理问题在任何语言环境下都相当困难)。

查看原文链接: https://about.sourcegraph.com/go/go-reliability-and-durability-at-dropbox-tammy-butow

2017-07-24 19:005855
用户头像

发布了 24 篇内容, 共 98178 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

开源商业模式促进金融业科技生态的发展

FinClip

开源 金融科技

写作的意义到底是什么

董一凡

写作

翻译和产品本地化的区别是什么?

葛仲君

翻译 本地化 全球化 产品开发

一个平凡程序员的年度总结

小智

程序员 人生

Clickhouse 性能测试

久吾尔岂

关于GDB你需要知道的技巧

泰伦卢

c c++ C#

Python3.6.1官方文档练习——初入江湖(一)

小匚

Python python3.x 入门

css常见问题总结

靖仙

CSS css3

DDD 实践手册(4. Aggregate — 聚合)

Joshua

设计模式 领域驱动设计 架构模式

浅谈SpringCloud之服务注册中心Eureka

北漂码农有话说

从删库到跑路?

芦苇

产品 职业 产品经理 职业素养 职业道德

内存对齐

泰伦卢

c c++ C#

写字工具更新史

Bonaparte

学习 读书笔记

业务代码的救星——Java 对象转换框架 MapStruct 妙用

周三不加班

MapStruct 对象转换

从一道面试题来看计算机基础知识的重要性

周三不加班

数组 堆栈 函数栈 函数栈调用

金融「中台」十宗罪

FinClip

中台 企业中台 业务中台

笔记:《如何系统思考》之如何做到系统思考

wiflish

思维方式

开始每周写作计划

M1racle

centos7 maven私服自动启动

kcnf

各大公司面试题分类整理

是小毛吖

面试 后端

Redis 6.0 新特性-多线程连环13问!

牧码哥

redis 多线程 io

MySQL中 int(11)和 int(10) 到底有没有区别?

周三不加班

MySQL 字符宽度 数据库数据类型

【译】【UX】一个页面可以有多个面包屑导航吗?

Yukun

用户研究 UX 面包屑导航

机会是留给不停寻找他们的人,而不是原地等待的人

非著名程序员

程序员 提升认知 机会 行动派

《TCP/IP详解》概述

网瘾少年SEC

TCP 网络协议 IP

当我们谈到ThreadLocal的时候,我们在谈什么?

Jason

Java 多线程 ThreadLocal

聊聊苹果账号的那些事儿

不要艾特我

iphone

一次线上服务高 CPU 占用优化实践

挖坑的张师傅

性能优化 JVM cpu

面试指南 | 终于要跟大家见面了,我有点紧张。

Apache Flink

大数据 flink 流计算 实时计算

C++线程池的实现

泰伦卢

c++ C# 线程池

C++定时器的实现

泰伦卢

c c++ C#

Dropbox公司的Go语言探索之路_语言 & 开发_Quinn Slack_InfoQ精选文章