6月の成果と7月の目標

もう7月半分以上たってしまいましたが、まずここ一ヶ月間の成果です。

6月の成果

  • em-websocketのdraft76対応に貢献

ここ最近ChromeだけでなくSafari 5, Firefox 4.0 betaでもWebSocketが実装されたのですが、5月末に仕様が大幅に変更となりました。

そこでうちのPusherでもいち早く新しい仕様に対応すべく、同僚のMartynと一緒にdraft76対応版を作成、em-websocketの作者に送ったところ、パッチが採用されることになりました。今までちょっとしたバグフィックス用のパッチを送ったりした事はあったのですが、結構コアとなる機能を貢献したことはなかったので、採用となり非常にうれしいです。あとwebsocket仕様変更を実装した際の知識を他のライブラリ作成者とも共有したいと思い、実装過程のノウハウもブログに書いておきました。

http://blog.new-bamboo.co.uk/2010/6/7/living-on-the-edge-of-the-websocket-protocol

かなりマニアックな内容だったので、読む人なんかいるのかと思っていましたが、他の方のプレゼンでも取り上げていただいたらしく、苦労して書いた甲斐がありました。

  • wsbench

「WebSocketってどれぐらいスケールするの」という素朴な疑問があったと、Apache Bench や Siege http://freshmeat.net/projects/siege/ にあたるようなベンチマークがWebSocket版にもあれば良いなと思って始めたプロジェクトです。

http://github.com/makoto/wsbench

まだまだ全然荒削りなのですが、とりあえず以下のようなシンタックスでWebSocketサーバがエコーを返す場合と、コネクション全体にブロードキャストした場合の時間をはかることは出来ます。

$ ruby wsbench.rb -h
Usage: wsbench.rb [options] [ws[s]://]hostname[:port]/path
eg: wsbench.rb -c 10 ws://localhost:8080/echo
-c connection number of concurrent connections (default: 10)
-t timeout timeout (default: 30)
-m message message size(bytes), (default: 1)
-T type type echo|broadcast (default: echo)
-h

Amazon EC2 small instance で試したところecho バージョンは20000以上でも十分動きました。broadcastバージョンはまだ4000コネクションでクライアント側がタイムアウトしてしまう問題が直ってません。あと対応プロトコルはdraft75のみで、draft76やwssバージョンは今後付け加えていく予定です。

  • nosqlsummer

この一ヶ月の間 2回のミーティングがあり、"Google Big Table", "Amazon Dynamo", "Cassandra"の論文についてディスカッションする機会がありました。Big Tableに関しては事前に勉強していたこともあり結構ディスカッションに加わることができましたが、他の2つに関しては少し準備不足の感が否めませんでした。ただわかったこととしては以下の点でしょうか。

Big TableやCassandraはサーチ目的で作られたため、レンジサーチやリッチなデータストラクチャーを提供。その点DynamoはシンプルなKey - Valueなデータ構造しか提供していない。そのかわりDynamoはショッピングカートがいかなる状況でもダウンしない(Available)ことを最優先としたアーキテクチャを採用。"Eventual Consistency"というデータの一時的な適合性を犠牲にしてでもAvailabilityを保つようにしている。

このアマゾンのDynamoモデルを深く理解するにはCAP, BASE, Eventual Consistency, Vector Clockといった他の理論を勉強する必要があります。

7月の目標

  • nosqlsummer

先のnosqlsummerの欄であげたいくつかの理論は次回のMeetingでまとめて取り上げる事になっています。前回の準備不足を挽回すべく、今回は予習に力を入れたいです。

  1. http://nosqlsummer.org/paper/cap-theorem
  2. http://nosqlsummer.org/paper/harvest-yield-and-scalable-tolerant-systems
  3. http://nosqlsummer.org/paper/eventually-consistent
  4. http://nosqlsummer.org/paper/base-vs-acid
  • Golangでwsbenchを書き、次回のGolang Meetupを企画し、そこで発表する

前回「新たにならった言語でライブラリを書く」と宣言したにも関わらず、実現せずじまいでした。やはり「ただ趣味でやる」というのはあまりモチベーションが上がらないようです。そこで自分を発奮するための仕掛けをする事にしました。前回参加したGolangワークショップが一回かぎりなのは残念なので、現在フォローアップミートアップを企画中です。一応趣旨としては、前回おこなったアサインメントの中で分からないところを教え合うようにするつもりなのですが、そこでできれば皆さんの個人プロジェクトも紹介できればと思っています。ということで現在Rubyで書いたwsbenchをgoで書き直してみて、なにか得た知見などあればそこで発表しようと今思い立ちました。

  • Ruby Kaigiの準備

あと6週間近くに迫っているのですが、まだ全然準備始めてません。とりあえずプレゼンのテーマだけ昨日思いつきました。おもしろいものにするべくがんばります。