Meteor入門 [4] 取り敢えず本家のDocumentを読みながら要約

途中だけど取り敢えず掲載。あとで追記の予定。

Data

Meteorクライアントはインメモリのデータベースキャッシュを持つ
クライアントキャッシュはサーバ側のマスターデータベースの部分的な複製を持つ

チャットシステムの例
サーバは例えば全てのルームとすべてのメッセージの2種類のセットを公開する
クライアントはルームのマスターセットと選択したルームのメッセージのセットに登録する
登録したら、クライアントはキャッシュを早いローカルデータベースとして使う
これでクライアントモデルのコードがとてもシンプルになる

Meteorの分散ドキュメント更新プロトコルはデータベース非依存。
デフォルトではMongoDB APIを使う。
サーバはMongoDBコレクションにドキュメントを格納する
クライアントはクエリと更新がMongoAPIで実装されたキャッシュをつかってキャッシュする

Meteor.publish("chatrooms");
Meteor.publish("messages", function (room_id) {
  return Messages.find({room] room_id});
});

Meteor.subscribe("chatrooms");
Meteor.subscribe("messages", Chatrooms.find()[0]._id);

ドキュメントの変更は自動的に拡散される。
insert, remove, updateなどはクライアントキャッシュデータで即座に実行される。
同時に、クライアントはサーバーに命令を送り、マスターデータベースも変更される。

通常クライアントとサーバは同意するが、異なるときもある?
(パーミッションのチェックや他のクライアントとのオーバーラップなど)
サーバの結果はクライアントに再公開される
同じ登録をしている全てのクライアントは更新されたドキュメントを受け取る

Messages.insert({room : 2413, text: "hello!"});

これによって、遅延の埋め合わせが実現される。
latency compensation = 遅延の埋め合わせ?
クライアントは必要なデータのフレッシュなコピーを保持し、サーバへのラウンドトリップ時間を待つ必要がない
クライアントがデータを変更した時はローカルで実行されるので、サーバを待たなくて良い

Reactivity

MeteorはReactive Programmingを用いている。
コードをシンプルに素早くかける
コード中で使っているデータが変更されたらそれを利用した結果も自動的に再計算される

Meteor.autosubscribe(function(){
  Meteor.subscribe("messages", Session.get("currentRoomId"));
}):