[Product/Platform/Protocol]Google Wave解剖―Wave入門…データ構造,入出力,リアルタイムの共同編集

この記事を読むのに必要な時間:およそ 4 分

Waveの共同編集

さて,ここまでの話であれば,Waveは少し特殊な「分散ストレージ」のようなイメージです。waveletという共有データがプロバイダ間で自動的に同期され,各自が自分のプロバイダからそれを読み書きするという構造です。

Waveに特徴的な機能として,⁠リアルタイムの共同編集」が挙げられます。利用者は単にドキュメントを交換できるというだけでなく,同じドキュメントを「同時に編集」することが可能です。ここがまさにWaveのコア技術の一つともいえるでしょう。

競合を解決する

単純なリソース管理の方法では,複数の人が同じドキュメントを編集すると競合が発生し,編集内容をうまく統合できないことがあります。競合を解決するにはいくつかの方法があります表1⁠。

Waveが採用しているのはマージの一種で,OT(Operational Transformation,操作変換)と呼ばれる理論的な基盤をベースにしています。OTではドキュメントの状態を,連続する一連の操作(operation)として表現します。操作には位置情報が含まれており,たとえば「ドキュメントの先頭(位置0)に文字列"x"を挿入する」図7 ②とか,⁠3番めの位置から文字列"c"を削除する」図7 ③といった具合に表されます。

図7 ドキュメントに対する一連の操作

図7 ドキュメントに対する一連の操作

表1 競合を解決するおもな方法

方法説明特徴
先着順最初に編集した人の変更内容を採用する誰でも同時に編集できる。タイミングが重なると,後から編集しようとした人は最新の内容を取り寄せてからやり直す
ロック複数の人が同時に編集できないようにする同時に編集することはできない。誰かが編集している場合は,それが終わるまで待たされる
マージ各自が編集した内容を後から合成する誰でも同時に編集できる。まったく同じ場所を編集したのでない限りは,各編集内容が適切に組み合わされる

操作を変換する

複数の人が同時に操作を行った場合,サーバ側でそれらが合成されます。サーバは一連の操作が整合性を持つように各操作を変換(transformation)します。図8では,2番めの位置を削除する操作op2が,別の操作op1の影響で,サーバ上では3番めの位置を削除する操作op2'に変換されています。

このように,同時並行で発生する複数の操作を,矛盾のないように一連の操作に変換する手続きがOTです。

図8 操作が変換される

図8 操作が変換される

waveletの履歴

以上のように,waveletの内容は一連の操作の列によって定まります。各プロバイダは,この操作の列をwaveletの履歴(history)として保持しており,いつでも過去の状態を取り出せるようになっています。

この履歴はwaveletを同期するためにも用いられます。たとえば,クライアントがオフラインになったり,プロバイダ間の通信が一時的に途絶えたとしても,通信が再開してからその間の差分だけを転送することによって最新の状態を取り戻せます。

オープンソース化

ここまでの話でも十分に複雑ですが,実際の処理はもっと複雑です。たとえば,多数の操作を効率良く処理するために,複数の操作を合成することが行われます。また,不具合により間違った操作が行われてしまうことを防ぐためにチェックサムを照合したり,送られてきた内容が本物であるかを検証するために署名を付けることもプロトコルの一部として定義されています。

容易に想像できるように,以上のような処理を間違いなく実装することは,いくらプロトコルが公開されたとしても簡単ではないでしょう。そのためGoogleは,こうしたOTのコアとなる部分をオープンソースとして実装し,Google自身もそれを使うことで,互換性の問題を回避しようとしています。

関連プロジェクト

Googleによって開発されているオープンソースのWave実装は,⁠FedOne」WEB+DB PRESS Vol.54 特別企画 第3章を参照)と呼ばれます。ただし,これはおもにプロトコルの正しさを確かめるためのリファレンス実装であり,実際の運用を目指したものではありません。現時点ではプロトコルも完全には定まっておらず,大きな変更がしばしば発生する状態ですが,FedOneとの相互運用を目指したプロジェクトもすでにいくつか始まっています表2⁠。

Waveの開発者向けサイトであるWaveSandbox.comでは,FedOneとの相互運用をスタートしており,Waveを活用したソフトウェアの開発も徐々に可能となってきています。

表2 Wave関連のプロジェクト

名称説明
FedOneGoogle公式のWaveプロトタイプ実装。Javaで実装されている
【URL】http://code.google.com/p/wave-protocol/
QWaveClientC++/Qtで実装されたWaveクライアント。FedOneに接続して,waveをGUIから操作できる
【URL】http://code.google.com/p/qwaveclient/
Ruby on SailsRubyで実装されたWaveサーバ。Webベースのインタフェースを持ち,FedOneとの相互接続も可能となっている
【URL】http://wiki.github.com/danopia/ruby-on-sails

まとめ

Waveのプロトコルについて,その全体像を見てきました。まとめると,Waveとは次のような特徴を持った共有ストレージであると考えられます。

  • 任意のXML文書を保管できる
  • 多人数でリアルタイムに編集ができる
  • 編集内容の履歴が保持される
  • 文書は複数のサーバに分散される

本記事は,第1章のみの掲載になります。

第2章からは,より具体的なWaveのしくみを解説し,自分でWaveプロバイダを立ち上げる方法を説明します。第2章以降は,WEB+DB PRESS Vol.54をご覧下さい。

著者プロフィール

西田圭介(にしだけいすけ)

COBOLコンパイラからVPNサーバ,ドライバ開発からWebアプリまで,必要とあらば何でも手掛けるフリーエンジニア。IPAの平成14年度未踏ユースにおけるスーパークリエータ。