DropboxがGoを使用するようになった方法
Tammyは、Rob Pikeの2012年の記事「 Go at Google:Software Designの言語設計 」を引用しています。これは、GoがDropboxでうまく機能する理由を一般的に伝えるためです。
「Goは効率的で、スケーラブルで、生産的な言語です。 一部のプログラマは、それを使って作業を楽しんでいます。 他の人はそれを平凡でさえ退屈だと感じます。 この記事では、これらすべての位置が互いに矛盾しない理由を説明します。 Goは、Googleでのソフトウェア開発で発生する問題を解決するように設計されており、研究の観点からブレークスルーではない言語の作成につながりましたが、それでも大規模なソフトウェアプロジェクトを開発するための優れたツールです。 - 2012年、ロブパイク
Dropboxの規模は印象的です。
- 5億人以上のユーザー
- 200,000人のビジネスユーザー
- 500ペタバイトのユーザーデータ
- マルチバイトGoストレージシステム
その結果、Dropboxはシステム、言語、開発者から多くのことを必要とします。 ガイド原則と要件は次のとおりです。
- 信頼できるシステムを構築する
- 安全なシステムを作成する
- 元のアーキテクチャで信頼性とセキュリティを組み合わせます
- 信頼性99.9999999999%(12の9)
- 可用性99.99%
Dropboxのステータスを移動
現在、ほとんどのDropboxインフラストラクチャはGoで記述されています。 特に:
- Goリポジトリサーバーには150人のユニークな貢献者がいます(社内の500人の開発者のうち)
- 15を超えるグループがDropboxでGoサービスを作成およびサポートします
- Goの全社で作成されたDropbox 130万行
Goで書かれたいくつかの主要なシステム:
- RAT:トラフィックのレート制限と調整(ミュート)
- HAT:memcachedの置換
- AFS: グローバルZookeeperを置き換えるファイルシステム
- Edgestore:分散データベース
- ボルト:メッセージ用
- DBmanager:6,000を超えるDropboxデータベースを自動化および監視する
- Jetstream、Telescope、ブロックルーティングなど
それらの多くは、以前の非囲systemsシステムの後継者です。
DropboxはGoの使用をどのように始めましたか?
Tammyは、Dropboxが自然にGoに切り替わった方法に関するいくつかのストーリーを共有しました。
ハッカーウィークのスピードリミッタープロトタイプを使用する
かつて発生したハッカーの週の前に、Dropbox開発者は、必要なサービスごとに速度制限と調整を個別に実装しました。 しかし、このハッカーの週の間、Dropboxのエンジニアの1人は、これらの機能の単一の実装を作成することにしました。 したがって、RAT(Rate Limiting And Throttling)が生まれました。
最初のRATプロトタイプは4日で作成され、5日目に示されました。 RATの作成後数週間以内に、RATに関する情報が会社全体に配布されました。 別のDropboxエンジニアがTammyのチームに書いて、PythonプロジェクトからRATを使用する方法を確認しました。 統合はスムーズに進み、サービスは自然な方法で採用されました。すぐにRATが有用になり始めました。 現在、いくつかのDropboxチームがRATを使用しています。
Dbmanager
Dropboxには6,000を超えるデータベースがあり、そのような大規模システムには自動化と監視が必要です。 任意の時点で、データベースの複製、障害、通常のレプリカからメインレプリカへの転送など。
このプロセスを管理するために、Dropboxのエンジニアは、6,000を超えるすべてのデータベースのステータスをすばやく表示するWeb UIであるDbmanagerを開発しました。 ステータス情報は他のシステムにも送信されます。
DropboxでGoバージョンをアップグレードする
何百人もの開発者と共に、DropboxはGoのメジャーバージョンの更新をきちんと調整します。 タミーは特定の問題について言及していませんでした。これはスムーズなプロセスを示しています。
興味深い事実:
- Dropboxは最近、Go 1.5から1.6への実稼働サービスの移行を完了しました。
- 更新プロセスを追跡するために、彼らは各サービスの所有者が進捗状況を報告し、必要に応じて助けを求める簡単なDropbox Paperドキュメントを作成しました。
- DropboxはGo 1.7のバージョンをスキップし、Go 1.6への移行が完全に完了するとすぐにGo 1.8に切り替わります(本番環境以外のサービスを含む)。
Dropbox Engineers Master Goの仕組み
各Dropboxエンジニアは、次の手順で構成される同じ厳格なGo開発プロセスを実行します。
- インフラストラクチャトポロジ、Goスタイルガイド、およびProtobufスタイルガイドを読む
- 厳密だが使いやすいコード分析
- Goで小さなアプリケーションを(App Storeで)作成する
- GoコードのビルドとテストのためのBazelの探索
経験豊富なプログラマーの場合、プロセスには約1週間かかります。
Go at Dropboxの導入でスムーズに進んだことは何ですか? そして何が違う?
全体として、DropboxのGoの使用は非常に成功しました。
- Goは高い生産性を簡単に示すことができます。
- Goは、サービスの作成と使用が簡単です。 (そして両方が好き!)
- 標準ライブラリは非常に優れています。
- デバッグツール(大部分!)
ここで、重要な事実の1つは、DropboxがGoサービスを他の言語で書き直そうとしないことです。 これは、人々が一般的に幸せであることを示しています。 (Tammyは興味をそそる詳細を明らかにしました。DropboxはRustを少し使用します。しかし、Goに代わるものではありません)。
Goで複雑なDropboxを見つけましたか?
タミーは、レースの状態で仕事と呼ばれる最大の難しさ。
- データの競合状態は、デバッグ、検出、修正などが最も難しいバグです。
- Dropboxのエンジニアの中には、このようなバグの検出に特に優れている人もいれば、経験に依存している人もいます。
- Goの競合状態検出器が常に役立つとは限りません。 彼が無力なときを理解する必要があります。
- データに同時にアクセスする必要がある場合は、Goプログラムを慎重に設計することが重要です。
Dropboxは、データの信頼性と耐久性に関心のあるエンジニアを採用しているため、彼らが理解するのは簡単でした(ただし、同時アクセスは常にどこでも困難です)。