スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

これまで書いたGoogleクラウド関連ペーパー&サンプルまとめ2013 #gcpja

Google Cloud SolutionsチームにSolutions Architectとして入って1年半くらいが経ちました。仕事の4割くらいは国内外のお客さんへの技術コンサルティング(Platinumサポート)、次の4割はホワイトペーパーの執筆やサンプルコードの実装、そして残り2割はApp Engineのトレーニング教材作成や講師のお仕事をやってきました。

年末ということもあるので、ここではこれまで私が書いたホワイトペーパーやサンプルをまとめてみたいと思います。気に入ったものがあればぜひ+1してくださいね! するとKazもっとその調子で書けとマネージャから指令が来ますw いまのところすべて英語ですが、もしかするといくつか日本語化されるかもです。

An Inside Look at Google BigQuery


Solutionsチームが一番最初に出したペーパー。Dremelのペーパーをベースに、BigQueryがどんな仕組みで動いているのかや、MapReduceとの違いや使い分けを解説。まとめると、1TBのデータを1秒でフルスキャンするには10,000台のディスクが必要で、ならばカラム型DBを横に10,000台並べてみようぜ!っていうのがDremel/BigQueryです。Googleやることが大ざっぱすぎます。速いわけです。Googleがこういうずっしりした(学術論文じゃない)技術ホワイトペーパーを出すのは当時まだあまり例がなかったので、社内で学術論文扱いされてGoogle四天王のUrsにまでレビューがエスカレーションしてしまってビビったのはいい思い出です(謝辞にUrsの名があるのはそうした理由です)。

AngularJS + Cloud Endpoints: a best practice to enable Client-side MVC framework


cloud.google.comで今のところいちばん読まれているペーパー。AngularJSみたいなクライアントサイドMVCやリッチなスマホアプリの時代なのだから、重いサーバーサイドMVCいらなくね? サーバー側で書いたロジックをREST APIでさくっと公開できるCloud Endpointsと組み合わせとけばよくね? っていう内容。でも実際にAngularJSとEndpointsのJSライブラリを組み合わせるサンプル書いてみたら、なんだかどっちがどんなふうに初期化されるのか混乱してハマった。そこで、社内のngエキスパートであるFredやえーじさんに手伝ってもらって、初期化部分のベストプラクティスをまとめた...っていう経緯です。

Mobile Backend Starter: API Guide


今のところ、Solutionsチームに入っていちばんこってり参加したプロジェクトはMobile Backend Starterかも。もともとはまだフリーだった3年ほど前に、「REST APIで簡単にアクセスできるJSONストレージがあればサーバー側コーディングいらないだろー」っていう発想(当時はまだBackend as a Serviceって言葉はなかった)から、jsonengineっていうApp Engineアプリをbluerabbitさん、knjさん、Jxckさん、itogさん、kissrobberさんらと作ってた。あんまり流行らなかったけど。。jsonengineでの経験ややり残したこともあったので、Solutionsチーム内でBaaS的なサンプルをつくろうってプロジェクトが立ち上がった時にさっそく参加。最初のバージョンはAndroidとサーバー側の9割方をひとりで書きました。今はMBSチームも大きくなってきて、Android版やiOS版はそれぞれ得意なメンバーが書いてます。

MBSでいちばん達成感あったのは、jsonengineでやり残してたワンクリックデプロイとcontinuous queryを実装できたこと。未来方向の検索(Prospective Search)と過去方向の検索(Datastore Query)、そしてGoogle Cloud MessagingとAPNSを統合して、リロードやポーリングのいらないリアクティブな検索機能を作りました。ごくおおざっぱに言うと、AngularJSのデータバインディングがサーバー上のデータストアとも連携する感じです。詳しくはこのスライドにも書いてあるのでご覧くださいー。

World Wide Maze: Real-time Gaming with Node.js + WebSocket


Chrome ExperimentsのWorld Wide Mazeの開発でCompute Engineまわりのお手伝いをしてたので、Futurekさんが設計されたCompute Engine上のWebSocketサーバー(Node.js/Socket.io)とApp Engineの連携などを解説。クライアント側についてはSaqooshaさんが詳細に解説されてます。端末やPCからのHTTPリクエストはApp Engineでまず受けて、リアルタイム通信に必要なWebSocket接続はCompute Engineに回す、という設計。リリース直後に国内外のメディアで紹介されたため予想外の負荷が集中したのですが、Futurekさんがきっちり負荷テスト等を実施してくれたおかげでWebSocket側もすんなりスケールアウトしてくれました。

Balancing Strong Consistency and Eventual Consistency with Google Cloud Datastore


Datastore(というか、多くのNoSQL)でいちばんのハマりポイントはeventual consistencyではないでしょうか。つまり、いまデータストアに追加した内容がすぐにはクエリに反映されない。Datastoreにはstrong consistencyとトランザクションを提供する機能があるので、それを使っていればeventual consistencyは発生しないのですが、使い方がそう単純ではないのとやはりスケーラビリティやパフォーマンスとのトレードオフになる。これまでの大手のお客様へのコンサルティング事例を通じてeventual consistencyに対処するノウハウもたまってきたので、Datastoreチームともディスカッションしながらベストプラクティスにまとめました。Datastoreでインデックスが古くなる点はこれまでも知られてましたが、値もまれに古いものが返ってくる、、っていうのはあまりきちんと説明されてないので要注意点です。

今、この続編となるペーパーを書いているところで、strong consistencyを提供するentity groupを使いつつも高いスループットを達成するデザインパターンを提案できる見込みです。来年頭に公開されると思いますので、ご期待くださいー。

そんなわけで、来年もこんな調子でGoogleクラウドのお仕事続けていきたいと思ってます。