The Go Blog

HerokuにおけるGo

キース・ラリックとブレイク・ミゼラニー
2011年4月21日

今週のブログ記事は、キース・ラリックブレイク・ミゼラニーが執筆しています。彼らはHerokuのシステムエンジニアです。彼らの言葉によると、彼らは「分散システムを食べ、飲み、眠る」そうです。ここでは、Goを使った経験について語っています。

分散システムを構築する上で大きな問題となるのが、物理サーバー間の連携です。各サーバーはシステム全体に関する様々な事実を知る必要があります。この重要なデータには、ロック、構成データなどが含まれ、データストア障害時でも一貫性と可用性を維持する必要があります。そのため、堅牢な一貫性保証を備えたデータストアが必要です。この問題に対する私たちの解決策は、Goで書かれた新しい、一貫性があり、高可用性のデータストアであるDoozerです。

Doozerの核心にはPaxosがあります。これは、信頼性の低いノードで構成される信頼性の低いネットワークでコンセンサスを解決するための一連のプロトコルです。Paxosはフォールトトレラントシステムを運用するために不可欠ですが、実装が難しいことで悪名高いです。オンラインで見られる例の実装でさえ、教育目的で簡略化されているにもかかわらず、複雑で理解しにくいものです。既存の運用システムはさらに悪いと評判です。

幸いなことに、Goの並行処理プリミティブのおかげで、この作業ははるかに簡単になりました。Paxosは、メッセージを介して通信する独立した並行プロセスとして定義されています。Doozerでは、これらのプロセスはゴルーチンとして実装され、それらの通信はチャネル操作として実装されています。ガベージコレクタがmallocとfreeを改善したのと同じように、ゴルーチンとチャネルがロックベースの並行処理アプローチを改善していることがわかりました。これらのツールにより、複雑な管理を避け、目の前の問題に集中することができました。難しいことで知られていることを、これほど少ないコード行数で達成できたことに、私たちは今でも驚いています。

Goの標準パッケージは、Doozerにとって別の大きな利点でした。Goチームは、それらに何を含めるかについて非常に実用的です。たとえば、私たちがすぐに役立つとわかったパッケージはwebsocketでした。動作するデータストアができた後、それをイントロスペクトしてアクティビティを視覚化する簡単な方法が必要でした。websocketパッケージを使用して、キースは帰りの電車の中で、外部依存性を必要とせずにウェブビューアを追加できました。これは、Goがいかにシステムプログラミングとアプリケーションプログラミングをうまく融合させているかを本当に証明しています。

私たちのお気に入りの生産性向上ツールの1つは、Goのソースフォーマッタであるgofmtでした。中括弧の位置、タブとスペースのどちらを使うか、代入を揃えるべきかどうかについて議論することは決してありませんでした。私たちは単に、gofmtのデフォルト出力が最終的な決定であることに同意しました。

Doozerのデプロイは、満足のいくほど簡単でした。Goは静的にリンクされたバイナリをビルドするため、Doozerには外部依存関係がありません。それは、どんなマシンにもコピーしてすぐに起動し、実行中のDoozerのクラスターに参加できる単一のファイルです。

最後に、Goのシンプルさと直交性への熱狂的な集中は、ソフトウェアエンジニアリングに対する私たちの見解と一致しています。Goチームと同様に、私たちはDoozerに含める機能について実用的です。私たちは細部にこだわり、新しい機能を追加するよりも既存の機能を変更することを好みます。この意味で、GoはDoozerに完璧に合致しています。

私たちはすでにGoの将来のプロジェクトを念頭に置いています。Doozerは、はるかに大きなシステムの始まりにすぎません。

次の記事:GoとGoogle App Engine
前の記事:Gofixの紹介
ブログインデックス