Google Waveは3つの要素で成り立っている: ツール、プラットフォーム、そしてプロトコルである。そのアーキテクチャの核は、並行制御をサポートするための理論的フレームワーク、オペレーショナルトランスフォーメーション(OT=Operational Transformation)である。
まず最初に定義が必要だろう。Google Waveとは:
(ウェーブと呼ばれる)ホストされたXMLドキュメントをベースとした、並行に行われる変更と遅延の少ない更新をサポートする、新しいコミュニケーションとコラボレーションのプラットフォームである。
ツール
Google Waveは「電子メールプログラム+インスタントメッセンジャー+協調的な文書共有と編集ツール」である。クライアントサイドではJavaScriptとHTML5を使っており、Chrome、Firefox、Safariといったブラウザー上で実行される。そこには(iPhoneやAndroidといった)モバイルプラットフォームも含まれる。一方、サーバサイドはJava+Pythonを使っているが、サーバサイドは顧客の要求するどんなものででも実装可能である。ツールはGWTを使って構築されており、ドラッグアンドドロップを扱うためにGoogle Gearsを利用している。ドラッグアンドドロップはHTML5にはまだ含まれていないからである。ツールは並行コミュニケーション、特に大きなチームで必要とされるようなコミュニケーションを扱うには専用のサーバが必要である。そのサーバは外部のクラウド上にあってもよいし、企業内にあってもよいし、もっとシンプルに、誰かの家にあってもよい。
Google Waveは先週のGoogle I/Oでデモが披露された。
プラットフォーム
Google Waveは公開APIと併せて発表され、GoogleはGoogle Waveが稼働する前にプラットフォーム全体をオープンソースにすることを約束している。プラットフォームとしては、Waveは開発者が、基礎となるコードを変更したり、ガジェットやロボットによって拡張したりすることを許容している。ガジェットとは、ウェーブの中で実行される小さなプログラムであり、ロボットは「自動化されたウェーブへの参加者」である。ウェーブはブログのような媒体に埋め込むことも出来る。
プロトコル
データモデル
Google Waveのデータモデルの主要要素は以下のようなものだ:
ウェーブ(Wave) - 各ウェーブは大域的に一意なウェーブIDを持ち、ウェーブレットの1つの集合から成り立っている。
ウェーブレット(Wavelet)- ウェーブレットは、それを含むウェーブ内で一意なIDを持ち、1つの参加者リストと1つの文書の集合から成り立っている。ウェーブレットは並行制御/オペレーショナルトランスフォーメーションが適用される実体である。
参加者(Participant) - 参加者はウェーブアドレスで識別される。ウェーブアドレスは電子メールアドレスのフォーマットと同じ形式(ローカル部@ドメイン)を持つテキストである。参加者は1人のユーザ、1つのグループ、1体のロボットなどであってよい。各参加者は参加者リストに最大一度出現する。
文書(Document) - 文書は、それを含むウェーブレット内で一意なIDを持ち、1個のXML文書と「離れた」アノテーションの1つの集合から成り立っている。離れたアノテーション(スタンドオフアノテーション、stand-off annotation)とはXML文書へのポインタであり、XML文書の構造には依存していないものである。そのアノテーションによって、テキストフォーマットやスペルのサジェスト、ハイパーリンクなどが表現される。文書はウェーブレットの中でツリー構造をなしている。
ウェーブビュー(Wave View) - ウェーブビューはあるユーザがアクセスしているウェーブの中のウェーブレットの部分集合である。ユーザは、ウェーブレットの参加者になるか、または、ウェーブレットの参加者になっているグループの一員になることで、ウェーブレットへのアクセスを獲得する。(グループは入れ子になっている場合もある)
オペレーショナルトランスフォーメーション
ここがWaveテクノロジのきわめて重要な部分である。Google Waveはサーバ上で実行されるオペレーショナルトランスフォーメーション (OT) を広く活用している。あるユーザが数人のユーザが開いている協調文書を編集するとき、クライアントプログラムはユーザがタイプした内容を即座に表示するオプティミスティックUI(Optimistic UI)を提供する一方、それとともに編集操作を承認サーバに送信して、その操作が承認されることを期待する。クライアントはサーバがその操作を評価するのを待ち、サーバがそれに対する応答を返すまで他の操作をキャッシュする。サーバが応答すると、キャッシュされていた操作はすべてまとめてクライアントからサーバに送信される。サーバは、他のクライアントから受け取った操作を考慮しつつ、操作を変換し、その変換に関する情報をすべてのクライアントに通知する。クライアントは受け取った情報にしたがってUIを更新する。操作は、それがバルク操作でない限り、文字単位を原則としてサーバに送られ、各クライアントに展開される。サーバは文書を管理しており、サーバが持つバージョンが「正当な」バージョンと見なされる。最終的には、各クライアントはサーバから受け取った最終バージョンで更新されるが、その最終バージョンはたくさんの操作の変換の結果である。通信の失敗やサーバ/クライアントのクラッシュなどに対するリカバリの方法も提供されている。クライアント-サーバ間で交換されるすべてのXML文書はチェックサムをあわせて通信することで、通信ミスを素早く識別できるようにしている。
クライアント-サーバ間プロトコル
操作 ウェーブレットはウェーブの基本構成要素であり、オペレーショナルトランスフォーメーションと呼ばれる一連の変更を受ける。これらの変更は各クライアントに展開され、適用されなければならない。さもないと、クライアントが同期できなくなってしまう。
操作の列 ウェーブレットに適用されるすべての操作は厳密に順序を保って送信される。サーバがその一つ前の操作に応答してくるまでは次の操作は送信されることはない。サーバは操作をバージョン番号をもとに並べ替える。各クライアントは操作を適切な順序に従って適用する必要がある。
ウェーブレットを開く ウェーブレット上での通信を開始するために、クライアントはウェーブIDとウェーブレットIDを含んだオープンリクエスト(Open Request)をサーバに送信する。サーバはスナップショット-ウェーブレットの直列化された状態-、あるいは、対応するバージョンの履歴ハッシュをともなって応答する。
サーバからクライアントへの通信 サーバはクライアントに、差分(一つまたは複数の操作の列)、バージョン番号、履歴ハッシュのいずれかを送信する。
クライアントからサーバへの通信 クライアントは差分かバージョン番号を送る。
リカバリ 通信が失敗すると、クライアントはサーバをもう一度開こうとする。その際、サーバから以前に受け取ったハッシュの履歴を送る。
フェデレーション
Google Wave フェデレーションプロトコルは複数のエンティティ(ウェーブプロバイダ)がウェーブを互いに共有することを許容している。ウェーブプロバイダは個人ユーザまたは全家族にウェーブを提供する誰かの家で稼働しているサーバであってもよいし企業でもよいし、ISPでもよい。Googleも単にもう1つのウェーブプロバイダである。
有用なリンク: Google Wave、Google Wave API、Wave プロトコル.