The New York Times開発チームは,Go言語(Golang)を使用したオープンソースのマイクロサービスツールキットである‘Gizmo’をリリースした。標準化されたコンフィギュレーションとロギング,戦略設定の可能な状態監視とエンドポイント計測機能,サービスのエクスペクテーション(expectation)とボキャブラリ(vocabulary)を定義する基本的なインターフェースを備えている。
The New York Timesのソフトウェア開発チームの開発実績を記したブログである‘Open’ Webサイトによると,同社では3年前からプログラム言語としてGo(lang)を採用している。さまざまなタスクにGoを使用しているが,最も多い用途はJSON APIの構築だという。APIベースのGoサービス開発がきっかけとなって,マイクロサービス用のツールキットである‘Gizmo’ が開発され,それがオープンソースとして公開されることになったのだ。
InfoQはThe New York Timesのプリンシパル・ソフトウェアエンジニアであるJP Robinson氏と席を同じくして,マイクロサービスツールキットを開発した動機,拡大するGoベースマイクロサービスフレームワークのシーンにおける位置付け,今後のロードマップについて話を聞いた。
InfoQ: ようこそ,JP! まずは‘Gizmo’ が何なのかを説明して頂けますか? このフレームワークを開発しようと思った理由についてもお願いします。
Robinson: GizmoはGoによるサービス,特にAPIやpubsubデーモンの開発を支援する,構成可能なツールと関数,そしてインターフェースのコレクションです。The New York Times社内でプロプライエタリなeメールプラットフォーム開発に従事している,少数の開発者グループによって開発が始められました。
APIとpubsubデーモンのいくつかが完成すると,他のチームにもGoの使用に興味を示すものが現れました。そのような中で,プロジェクト間のメンバ移動や,開発者が“このエンドポイントの指標を得るにはどうすればよいのか?”あるいは“正常にシャットダウンする方法は?”といったことに煩わされずに,ビジネス上の問題に集中できるようにするには,共通のボキャブラリや構造を用意しておく必要があると考えるようになったのです。
InfoQ: Goの標準ライブラリを単純に使う場合や,他のGoマイクロサービスフレームワークと比較した時,Gizmoを使うことでマイクロサービスの記述はどの程度簡単になるのでしょう?
Robinson: 開発者にとってのGizmoは標準ライブラリの‘感触’ を持っていますが,それだけに留まらず,マイクロサービスのオーケストレーションを行なう上で最低限の付加機能を提供します。例えばGizmoにはhttp.Handlersをラップするサービスミドルウェアがありますが,そのエンドポイントはhttp.HandlerFuncsになっています。これにより,標準ライブラリと同じようなコードを記述するだけで,Gizmoが自動的にステータスコードや要求実行時間といったメトリックを収集してくれます。
標準ライブラリを再利用しているため,Go言語の開発者がコードを一通り読んで,その内容を正確に把握することも可能になります。さらに,標準ライブラリのインターフェースに準拠している既存のオープンソースツールであればGizmoにフック可能である,という点もメリットのひとつにあげられます。‘github.com/NYTimes/gziphandler’やGorilla toolkitの‘handlers.CombinedLoggingHandler’などがGizmo使用の好例です。
InfoQ: 先日のNYTimesのブログ記事“Introducing Gizmo”では,Gizmoは作られたのはPeter Bourgon氏のGo Kit(InfoQの記事参照)があったからだ,と書かれていますが,これについて詳しく説明して頂けますか?両方のフレームワークに精通することは,開発者にとってメリットがあるのでしょうか?
Robinson: Peter Bourgon氏がFOSDEM 2015で行なったGo Kitの講演を見て,私は非常に感銘を受けました。そこですぐに,プロジェクトのREADMEから社内で利用できそうな“関連プロジェクト”を探し始めたのです。NYTではさまざまなサービスがありますが,大部分はHTTP上でJSONを使っています。そのため,リストにあったRPC中心のフレームワークは,そのままでは社内で使用することはできませんでした。
それと同時に,利用可能なフレームワークのいくつかは,標準ライブラリの感触の大部分を抽象化して隠してしまっているようにも思えました。私たちとしては,多くの部分で利用するために,もっとシンプルなものが欲しかったのです。そのような理由から,Go Kitの次の点を目標から外すことにしました。
- 既存のパッケージをラップすることで提供可能な機能の再実装
- GizmoのSimpleServerはGorilla Toolkitのmuxとcontext,github.com/Sirupsen/logrus,github.com/rcrowley/go-metrics,それと標準ライブラリで構成されたサーバそのものです。RPCServerでは同じものにgRPCを追加しています。
- RPC以外のメッセージパターンのサポート
- Gizmoのpubsubパッケージは,Publisher/Subscriberインターフェースとその実装を提供しています。
- プロセス管理に関する見解
- Gizmoサーバは,構成および拡張が可能なヘルスチェック用のエンドポイントを提供しています。それらを通じて,ディスカバリシステム(Consulなど)がGizmoにインタラクションを持つと想定しています。
- コンフィギュレーションパッシングに関する見解
- Gizmoサーバとpubsubパッケージは構成パッケージに強く結合されています。コンフィギュレーション構造がどこに配置されるか(環境変数,ConsulテンプレートをベースとするJSONファイル,Cosulのキー/バリューストア,CLIフラグなど)について,特定の方針は持っていません。このようにパッケージをフレキシブルにすることで,各チーム独自の編成にも素早く対応できますし,構成さえ決めてしまえば同じ出発点に立てるようにもなります。
GoKitServerあるいは/またはGoKitServiceにGizmoのサーバパッケージを組み込むというアイデアは,ここから来ました。私自身としては,Gizmoの持っている既存のServerとServiceのインターフェースと一緒に,Go Kitのエンドポイントやツーリングのパッケージもサーバに組込みたいと思っています。
InfoQ: Gizmoは,例えばRightScaleのGoaフレームワークに比べると,API設計に関する主張がそれほど強くないように思えますが,これには何か意図があるのでしょうか?
Robinson: ツールキットをシンプルで,Goのプログラム開発流儀に従ったフレキシブルなものにしたかったこと,穏やかな学習曲線を維持することで採用をスピードアップしたかったこと,この2つです。Gizmoを使ってアプリケーションを開発できそうな方法は数多くあるので,何の指導もない野放しな使い方では問題が発生するかも知れません。今はGizmoアプリの構造と開発,テストの方法についてのガイダンスを提供するために,open.blogs.nytimes.com向けの記事シリーズに取り組んでいるところです。
InfoQ: Gizmoプロジェクトに興味のあるInfoQ読者がプロジェクトにコントリビュートするためには,どのような方法がよいのでしょう?
Robinson: ここThe New York Timesでは現在でも,多くをSimpleServiceやJSONServiceに頼っているのですが,GoKitServerか (Gorillaのmuxではなくて) github.com/julienschmidt/httprouter の FastSimpleServer,あるいは (Node.js/expressの競合である)Hugoのテンプレートツールセットを使ったWebServerでもよいので,試してみてもらえないかと思っています。まだ試験実装の段階ですが,Kafkaのpubsubパッケージなどもテストしてみたいですね。
こういったタスクでは荷が重いようならば,どのようなレベルでも構いませんから,テスト手順を提供して頂ければと思います。先日も,ContextServiceとContextHandlerをツールキットに追加するためのテスト手順を追加したばかりなので,たくさんの人たちに試して頂いて,発見される可能性のあるバグのイシューを作って頂きたいと思っています。いずれにしても,プロジェクトの変更や改良について議論したいのであれば,Gopher Slackグループの#gizmoチャネルへの参加をお勧めします。
InfoQ: 今日はお時間を頂いてありがとうございました。他に何か,InfoQ読者に伝えておきたいことはありますか?
Robinson: Gizmoを紹介する機会を頂いて,ありがとうございます!すばらしいGoコミュニティにオープンソース公開することでこのツールキットが大きく改善されて,このプログラム言語が他の企業でも採用されるきっかけになればと思っています。Goがより多くの“現代的な企業”に利用されることを期待すると同時に,Gizmoがその一端を担うようになればと願います。
The New York TimesのGizmoマイクロサービスツールキットに関する詳細情報は,同社‘Open’ テクノロジブログの記事‘Introducing Gizmo’ や,GizmoのGitHubリポジトリで見ることができる。