Go ブログ
Heroku での Go
今週のブログ記事は、Keith Rarick 氏と Blake Mizerany 氏、Heroku のシステムエンジニアによって執筆されました。 彼ら自身の言葉で言えば、「分散システムを食べ、飲み、そして眠る」ということです。ここでは、Go を使用した彼らの経験について説明します。
分散システムを構築する際に大きな問題となるのは、物理サーバーの調整です。各サーバーは、システム全体に関するさまざまな事実を知る必要があります。この重要なデータには、ロック、構成データなどが含まれ、データストアの障害時でも一貫性と可用性を維持する必要があるため、堅牢な一貫性保証を備えたデータストアが必要です。この問題に対する私たちの解決策は、Go で記述された、新しく、一貫性があり、可用性の高いデータストアである Doozer です。
Doozer の中核にあるのは、信頼性の低いノードの信頼性の低いネットワークにおいてコンセンサスを得るためのプロトコルのファミリである Paxos です。Paxos はフォールトトレラントシステムを実行するために不可欠ですが、実装が難しいことで有名です。オンラインで見つけることができる実装例でさえ、教育目的のために簡略化されているにもかかわらず、複雑で理解しにくいです。既存の本番システムは、さらに悪いという評判があります。
幸いなことに、Go の並行処理プリミティブは、このタスクをはるかに容易にしました。Paxos は、メッセージの受け渡しによって通信する、独立した並行プロセスとして定義されています。Doozer では、これらのプロセスはゴルーチンとして実装され、通信はチャネル操作として実装されます。ガベージコレクターが malloc と free を改善するのと同じように、ゴルーチンとチャネル は、並行処理に対するロックベースのアプローチを改善することを発見しました。これらのツールにより、複雑なブックキーピングを避け、目の前の問題に集中することができました。難しいことで有名なことを実現するために、どれほど少ないコード行数で済んだのか、私たちは今でも驚いています。
Go の標準パッケージは、Doozer にとってもう1つの大きな勝利でした。Go チームは、何が標準パッケージに含まれるかについて非常に実用的です。たとえば、私たちがすぐに役立つとわかったパッケージは、websocket でした。動作するデータストアができた後、それをイントロスペクトし、アクティビティを視覚化する簡単な方法が必要でした。websocket パッケージを使用することで、Keith は帰宅途中の電車内で、外部依存関係を必要とせずに Web ビューアーを追加することができました。これは、Go がシステムプログラミングとアプリケーションプログラミングをいかにうまく組み合わせているかを実証するものです。
私たちのお気に入りの生産性向上ツールの1つは、Go のソースフォーマッターである gofmt によって提供されました。中括弧をどこに置くか、タブとスペースのどちらを使用するか、代入を揃える必要があるかなど、議論することはありませんでした。私たちは単に、gofmt からのデフォルト出力に従うことに同意しました。
Doozer のデプロイは、満足のいくほどシンプルでした。Go は静的にリンクされたバイナリをビルドします。つまり、Doozer には外部依存関係がありません。任意のマシンにコピーしてすぐに起動し、実行中の Doozer のクラスターに参加できる単一のファイルです。
最後に、Go のシンプルさと直交性への徹底的なこだわりは、私たちのソフトウェアエンジニアリングに対する見解と一致しています。Go チームと同様に、私たちは Doozer にどのような機能を追加するかについて実用的です。私たちは細部にこだわり、新しい機能を導入する代わりに既存の機能を変更することを好みます。この意味で、Go は Doozer に最適です。
私たちはすでに Go での将来のプロジェクトを構想しています。Doozer は、はるかに大きなシステムのほんの始まりにすぎません。
次の記事:Go と Google App Engine
前の記事:Gofix の紹介
ブログインデックス