Goブログ
GoでStatHatを構築
はじめに
私の名前はPatrick Crosbyで、Numerotronという会社の創設者です。私たちは最近、StatHatをリリースしました。この記事は、Goを使用してStatHatを開発した理由と、Goの使用方法の詳細について説明します。
StatHatは、コード内の統計情報やイベントを追跡するためのツールです。HTML、JavaScript、Go、および他の12の言語からの統計情報の送信をサポートしているため、HTMLデザイナーからバックエンドエンジニアまで、誰でもStatHatを簡単に使用できます。
数値をStatHatに送信すると、データの美しく、完全に埋め込み可能なグラフが生成されます。StatHatは、指定されたトリガーが発生したときに警告を発し、毎日のメールレポートを送信するなど、多くの機能を提供します。そのため、アプリケーションの追跡ツールやレポートツールを作成する時間を費やす代わりに、コードに集中できます。あなたが実際の仕事をしている間、StatHatは山頂の巣にいるワシ、あるいは覚醒剤を服用したベビーシッターのように、非常に警戒を怠りません。
ニューヨーク、シカゴ、サンフランシスコの気温を示すStatHatグラフの例を次に示します。

アーキテクチャの概要
StatHatは、受信統計/イベントAPI呼び出しと、統計を表示および分析するためのWebアプリケーションという2つの主要なサービスで構成されています。データ収集とデータ操作を分離するために、これらをできるだけ分離したいと考えていました。これには多くの理由がありますが、主な理由の1つは、大量の自動受信API HTTPリクエストを処理することを想定しており、そのため、人間と対話するWebアプリケーションとは異なる最適化戦略が必要になるためです。

Webアプリケーションサービスは多層構造です。Webサーバーはすべてのリクエストを処理し、インタラクター層に送信します。単純なタスクの場合、インタラクターは必要なデータを生成します。複雑なタスクの場合、インタラクターは複数のアプリケーションサーバーに依存して、グラフの生成やデータセットの分析などのタスクを処理します。インタラクターが処理を完了すると、Webサーバーは結果をプレゼンターに送信します。プレゼンターは、HTMLまたはJSONでHTTPリクエストに応答します。サービスの需要の増加と変化に応じて、Web、API、アプリケーションサーバー、およびデータベースを水平方向に拡張できます。各アプリケーションサーバーには複数のコピーが実行されているため、単一障害点はありません。インタラクター層により、システムに異なるインターフェース(http、コマンドライン、自動テスト、モバイルAPI)を持つことができます。StatHatはデータストレージにMySQLを使用しています。
Goを選択する
StatHatを設計したとき、開発ツールについて次のチェックリストがありました。
-
バックエンドシステムとフロントエンドシステムに同じプログラミング言語を使用する
-
優れた高速HTMLテンプレートシステム
-
多数の調整のための高速起動、再コンパイル、テスト
-
1台のマシンで多数の接続
-
アプリケーションレベルの並行処理を処理するための言語ツール
-
優れたパフォーマンス
-
階層間で通信するための堅牢なRPCレイヤー
-
豊富なライブラリ
-
オープンソース
私たちは、多くの一般的およびあまり一般的ではないWebテクノロジーを評価し、最終的にGoで開発することを選択しました。
Goが2009年11月にリリースされたとき、すぐにインストールして、高速なコンパイル時間、ゴルーチン、チャネル、ガベージコレクション、そして利用可能なすべてのパッケージを気に入りました。特に、アプリケーションで使用しているコードの行数が少ないことに満足していました。すぐにLangalotというWebアプリを作成してみることにしました。これは、クエリを入力すると、5つの外国語辞書を同時に検索するものです。驚くほど高速でした。2010年2月からオンラインで公開しており、それ以来ずっと稼働しています。
以下のセクションでは、GoがStatHatの要件をどのように満たしているか、そしてGoを使用して問題を解決した経験について詳しく説明します。
ランタイム
APIおよびWebアプリサーバーには、標準のGo httpパッケージを使用しています。すべてのリクエストは最初にNginxを通過し、ファイル以外のすべてのリクエストはGoを搭載したhttpサーバーにプロキシされます。バックエンドサーバーはすべてGoで記述されており、フロントエンドとの通信にrpcパッケージを使用しています。
テンプレート
標準のtemplateパッケージを使用してテンプレートシステムを構築しました。私たちのシステムは、レイアウト、いくつかの一般的なフォーマット関数、そして開発中にテンプレートをオンザフライで再コンパイルする機能を追加します。Goテンプレートのパフォーマンスと機能に非常に満足しています。
調整
以前の仕事では、C++で書かれたThrone of Darknessというビデオゲームに取り組んでいました。いくつかのヘッダーファイルがあり、変更するとシステム全体の完全な再構築が必要になり、20〜30分かかりました。誰かが `Character.h` を変更すると、他のすべてのプログラマーの怒りを買うことになります。この苦しみの他に、開発時間も大幅に遅くなりました。
それ以来、私は常に、迅速かつ頻繁な調整を可能にするテクノロジーを選択するように努めてきました。Goを使用すると、コンパイル時間は問題になりません。システム全体を数分ではなく数秒で再コンパイルできます。開発Webサーバーはすぐに起動し、テストは数秒で完了します。前述のように、テンプレートは変更されると再コンパイルされます。その結果、StatHatシステムは非常に使いやすく、コンパイラがボトルネックになることはありません。
RPC
StatHatは多層システムであるため、すべての通信が標準化されるようにRPCレイヤーが必要でした。Goでは、Goオブジェクトのエンコードにrpcパッケージとgobパッケージを使用しています。Goでは、RPCサーバーはGoオブジェクトを受け取り、そのエクスポートされたメソッドを登録するだけです。中間インターフェース記述言語は必要ありません。非常に使いやすいことがわかりました。また、コアアプリケーションサーバーの多くは300行未満のコードです。
ライブラリ
SSL、データベースドライバー、JSON / XMLパーサーなどのライブラリを書き直すのに時間を費やしたくありません。Goは若い言語ですが、多くのシステムパッケージと増加するユーザー提供のパッケージがあります。ほんの少しの例外を除いて、必要なすべてのことについてGoパッケージが見つかりました。
オープンソース
私たちの経験では、オープンソースツールで作業することは非常に貴重でした。何かがうまくいかない場合、すべてのレイヤーを通してソースを調べることができ、ブラックボックスがないことが非常に役立ちます。言語、Webサーバー、パッケージ、ツールのコードがあれば、システムのすべての部分がどのように機能するかを理解できます。Goのすべてはオープンソースです。Goコードベースでは、テストをよく読んでいます。テストは、パッケージと言語機能の使用方法の優れた例を示していることが多いためです。
パフォーマンス
人々は最新のデータ分析のためにStatHatに頼っており、システムができるだけ応答性の高いものにする必要があります。私たちのテストでは、Goのパフォーマンスはほとんどの競合他社を圧倒しました。Rails、Sinatra、OpenResty、Nodeに対してテストを行いました。StatHatは、リクエスト、特定のタスクの期間、使用中のメモリ量など、あらゆる種類のパフォーマンスメトリックを追跡することで、常に自身を監視してきました。このため、さまざまなテクノロジーを簡単に評価できました。また、Goテストパッケージのベンチマークパフォーマンステスト機能も活用しています。
アプリケーションレベルの並行処理
以前は、OkCupidでCTOを務めていました。そこでOKWSを使用した経験から、特に動的なWebアプリケーションに関して、非同期プログラミングの重要性を学びました。データベースからユーザーをロードしてから、統計情報を検索し、アラートを検索するなど、同期的に行う理由はありません。これらはすべて同時に実行する必要がありますが、驚くべきことに、一般的なフレームワークの多くは非同期サポートを備えていません。Goは、コールバックスパゲッティなしで、言語レベルでこれをサポートしています。StatHatは、複数の関数を同時に実行するためにゴルーチンを広範囲に使用し、ゴルーチン間でデータを共有するためにチャネルを使用します。
ホスティングとデプロイメント
StatHatは、AmazonのEC2サーバーで実行されます。私たちのサーバーはいくつかのタイプに分けられます
-
API
-
Web
-
アプリケーションサーバー
-
データベース
各タイプのサーバーは少なくとも2つあり、高可用性のために異なるゾーンにあります。新しいサーバーをミックスに追加するには、わずか数分かかります。
デプロイするには、まずシステム全体をタイムスタンプ付きのディレクトリにビルドします。私たちのパッケージスクリプトは、Goアプリケーションをビルドし、CSSおよびJSファイルを圧縮し、すべてのスクリプトと構成ファイルをコピーします。次に、このディレクトリがすべてのサーバーに配布されるため、すべてのサーバーに同一の配布がされます。各サーバー上のスクリプトは、EC2タグを照会して、実行する責任があるものを決定し、サービスを開始/停止/再起動します。多くの場合、サーバーのサブセットにのみデプロイします。
詳細
StatHatの詳細については、stathat.comをご覧ください。私たちが作成したGoコードの一部をリリースしています。すべてのオープンソースStatHatプロジェクトについては、www.stathat.com/srcにアクセスしてください。
Goの詳細については、golang.orgをご覧ください。
次の記事:Goコミュニティを知る
前の記事:ゼロからGoへ:24時間でGoogleホームページに公開
ブログインデックス