実現しているのかが解説されています。サーバー側にも手を入れるリソースがあれば、この資料の内容をそのまま模倣するのもアリだと思います。さんが日本語訳を用意してくれていたりするので、こちらを読んだほうが楽かもしれません。(発表前日に見つけました)ninjinkun/EDAMSyncgithub.com採用した仕組み前述の資料を参考にしながら、仕組みとして取り入れたのが、下記の要素です。SyncEvernoteからもらってきた考え方です。Syncは完全同期と訳せそうです。その時手に入る情報を全部落としてきてしまう種類の同期です。差分について考えなくてもいい代わりに、データ量が多くなりがちです。Syncは逐次同期とでも訳せばよいでしょうか。クライアントがどの時点までのデータを持っているのかをサーバーに伝えることで、それ以降の差分となるデータだけを請求できます。一度の同期に関わるデータの量は少なくなりますので、定期的に同期する際にはこちらの方法のほうが有効です。アプリ内に持っています。API呼び出しのパラメータにこの時刻を載せることで、それ以降に変更のあったデータのみを受け取ることができるのです。サーバー側の仕組みとしては、各APIに対応するテーブルのmodified_at列を見に行って、パラメータに指定した時刻以降の変更を返すようにしてもらっています。Syncはどちらかというと取得するデータに主眼を置いた仕組みでしたが、こちらは送信するデータに主眼を置いています。flagと呼ばれていましたが、未同期のクライアント環境でデータに変更があったことを表すフラグという点では同じ性質のものです。DELETEの4つのステータスを持つフラグを切り替えることで、各データの状態を表すことにしました。同期の流れそれでは実際に同期の流れを見て行きましょう。Hacksでの流れを踏襲しました。1の時刻を保存するこれで同期が成立しているはずです。同期の理屈はできましたが、もう一つ考えないといけないことがあります。サーバーが行なったデータ操作と"dirty"なデータの間で競合があった場合です。具体的には、以下の2つの段階で問題になります。サーバーで更新されていたデータをクライアントでも更新するクライアント側のデータが変更されていて、なおかつサーバーからもデータを貰ってしまったとき、取れる選択肢は限られそうです。常にサーバー側が勝つ(送信しない)常にクライアント側が勝つ(サーバーからのデータを捨てる)クライアント側でマージしてからサーバーへ送る(なんとか全部生かす)せっかく手元で作ったデータですから、送信したいですよね。サーバーに勝たれるのは困ります。クライアント側のデータをそのまま送るか、サーバーから貰ったデータとなんとかマージしてから送るか、といったところになりそうです。アグリノートアプリではクライアントが勝つことにしてあります。マージといってもどこからどこまでマージしたものか検討するコストが高そうだったからです。Evernoteで以前試したときには、マージしてから送信する方法を取っていました。EDAMにもそう書かれています。そもそも、ブラウザ対ブラウザでも画面の表示タイミングや保存を押すタイミングによっては起こることですし、そのときには後勝ちになる場合が多いと思うので、この件もクライアント側が勝つのが自然なんじゃないかと思うのです。同期パターンの確認さて、流石にそろそろ話がごちゃごちゃしてきたので、頭の中を整理するために同期のパターンを表にまとめてみました。CLEANのどれだったか更新されたものが降ってきたのか、削除されたものが降ってきたのか、何も降ってこなかったのか結果としてクライアント側のデータがどう更新され、サーバーにはどのデータが送られるのかこのへんについてまとめられています。チーム内での認識合わせに役立ちました。まとめ同期が必要になるような要件が出てきたら、この話を思い出してください。mixi-inc/AndroidTrainingでSyncAdapterを勉強して50AHでSyncAdapterのサンプルを知ってEDAMの理屈を参考にして同期の仕組みを考えるこんな流れで乗り越えられる山があるはずです。最後にウォーターセル株式会社では、地球人口100億の時代に見合う食料生産のための農業革命を一緒に引っ張っていってくれるAndroid/iOSエンジニアを探しています。弊社事業に興味のある方は、是非ご連絡ください。Hacksのサンプルは読み応えがあり良い資料なので是非読むべきですし、本の内容も概ね良いのですが、SyncAdapter章に致命的な誤訳があるので気をつけましょう。サーバーの代わりにデータベースを叩く原著がサンプルとして公開されているので、英語版と読み比べながら読むくらいでちょうどいいかもしれませんね。chapter5に該当の章があります)正誤表が見つからなかったので、この場を借りて紹介しました。正誤表のページがあれば教えていただければ幸甚です。Blog|ブログを報告する。