Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
僕らのデータ同期プラクティス
Nkzn@ウォーターセル株式会社
2015.4.25 DroidKaigi
裏おもしろそう・・・・・!!!
こっち来てくれた皆さんありがとうございます
@Nkzn (なかざん)
• 中川 幸哉 (28)
• WaterCell Inc. @ Niigata
• UIデザイナーとアーキテクトの狭間をうろう
ろしている
• 日本Androidの会 新潟支部(活動停止中)
私とAndroid
• 2009年:卒業研究でAndroid(HT-03A)
• 2010年:日本Androidの会 新潟支部立ち上げ
• 2011年:現職にJOINして農業者向けアプリ作り
• 2013年:Eclipseと決別してAndroi...
感想文書いたら
結構話題になってビビった
Where is your user?
Where is your user?
自社アプリをオフライン化
∼試される大地∼
弊社サービスについて
• アグリノート

http://www.agri-note.jp
• 農業生産者向けの農作業管理システム
• Webブラウザ版、Androidアプリで提供

iOS版は開発準備中
• 農業版Redmineに近づいてる
水稲/コシヒカリ ほ場:A-2
作業予定・記録
日付
作業項目
作業者・作業時間
農薬名・使用量
肥料名・使用量
機械
写真
メモ
マスタデータと
トランザクションデータ
ファーストバージョン
2012年3月リリース。
画面開いた時にフェッチしてくるやーつ。
=電波がないところでは動かない
30km
(電波が)
試される大地
気合で同期機能を実装する
AlarmManager + IntentService ???
同期処理に必要なもの
• 定期的に、または何らかのキックにより
• バックグラウンドで通信を行い
• アプリ内のDBを更新する
2013年スタイル
AlarmManager
IntentService
頑張ってデータを
ダウンロードしてきて
INSERTする処理
Intent
定期的に実行
れ出るつらみ
• AlarmManagerがときどき消える
• IntentServiceが連続で走って止まらない
• マルチスレッドでDB叩く状態に突入
• synchronized祭り
• ネットワーク有無の検知のために割と頻繁に起動
Androidが提供するデータ同期機能
AccountAuthenticator + SyncAdapter + ContentProvider
AndroidManifest.xml
SyncService xml/authenticator.xml
<service>
xml/sync_adapter.xml
<service><provider>
authorities Conte...
本当に大事なのは
onPerformSyncの中で何をするか
public class SyncAdapter extends AbstractThreadedSyncAdapter {
// ...
@Override
public void...
設計を分けれるの嬉しい
ContentProvider
SQLite
Data Access Object
UI付近のコード SyncAdapter
API Client
AccountAuthenticator
AccountManager
使ってる人が少ない気がする
ドキュメンテッドになったのが
割と最近?
2013年まで公式ドキュメントなかったっぽ
い・・・?(Web Archive調べ)
突然情報が出始めた
2009年 2010年 2011年 2012年 2013年 2014年
Android 2.0 Google I/Oで言及
50 Android Hacks
公式ドキュメントが公開?
50 Android Hacks日本語版...
同期アルゴリズムの検討
参考にした資料
• 50 Android Hacksのサンプルコード
• https://github.com/Macarse/50AH-code/
• Hack 23(Pythonサーバー付き)
• Evernote Synchronizat...
採用した仕組み
• Full Sync, Incremental Sync
• StatusFlag("dirty" flag)
Full Sync, Incremental Sync
サーバー
クライアント
1 2 3
1 2 3
1 2 3
1 2
3
Full Sync Incremental Sync
差分を請求する
id data modified_at
1 hoge 10:00
2 fuga" 12:00
3 piyo" 15:00
4 hogehoge" 20:00
http://hoge/hoge?modified_after=13:00...
StatusFlag ("dirty" flag)
未同期のクライアント環境でデータに変更が
あったことを表すフラグ
4つのStatus
CLEAN サーバーから受け取ったままの状態
ADD
新規に作成された
(まだクライアント側にしかない)
MOD サーバーから受け取ったものに変更を施した
DELETE サーバーから受け取ったものを削除した
同期の流れ
同期の流れ
1. データのダウンロードを行う
• 初回はFull Sync, 2回目以降はIncremental Sync
2. サーバーで削除されていたデータをクライアントでも削除する
3. サーバーで更新されていたデータをクライアントでも更...
競合問題
> 2. サーバーで削除されていたデータをクライアントでも削除する
> 3. サーバーで更新されていたデータをクライアントでも更新する
同じデータの削除や更新がサーバーとクライアント両方で行われてい
た場合、競合する
対応策
• 常にサーバー側が勝つ
• 送信を諦める
• 常にクライアント側が勝つ
• サーバーからのデータを捨てる
• クライアント側でマージしてからサーバーへ送る
• なんとか全部生かす
Evernoteはこれ
アグリノートはこれ
同期パターンの確認
まとめ
• mixi-inc/AndroidTrainingでSyncAdapterを勉強して
• 50AHでSyncAdapterのサンプルを知って
• EDAMの理屈を参考にして同期の仕組みを考える
• 競合解決の方針はそのサービスのポリシ...
最後に
ウォーターセル株式会社では、地球人口100億の時
代に見合う食料生産のための農業革命を一緒に引っ
張っていってくれるAndroid/iOSエンジニアを探し
ています。
僕らのデータ同期プラクティス
僕らのデータ同期プラクティス
僕らのデータ同期プラクティス
Upcoming SlideShare
Loading in …5
×

僕らのデータ同期プラクティス

19,787 views

Published on

2015年4月25日に行われたDroidKaigiでの発表資料です。

Published in: Technology
  • Be the first to comment

僕らのデータ同期プラクティス

  1. 1. 僕らのデータ同期プラクティス Nkzn@ウォーターセル株式会社 2015.4.25 DroidKaigi
  2. 2. 裏おもしろそう・・・・・!!! こっち来てくれた皆さんありがとうございます
  3. 3. @Nkzn (なかざん) • 中川 幸哉 (28) • WaterCell Inc. @ Niigata • UIデザイナーとアーキテクトの狭間をうろう ろしている • 日本Androidの会 新潟支部(活動停止中)
  4. 4. 私とAndroid • 2009年:卒業研究でAndroid(HT-03A) • 2010年:日本Androidの会 新潟支部立ち上げ • 2011年:現職にJOINして農業者向けアプリ作り • 2013年:Eclipseと決別してAndroid Studioを導入
  5. 5. 感想文書いたら 結構話題になってビビった
  6. 6. Where is your user?
  7. 7. Where is your user?
  8. 8. 自社アプリをオフライン化 ∼試される大地∼
  9. 9. 弊社サービスについて • アグリノート
 http://www.agri-note.jp • 農業生産者向けの農作業管理システム • Webブラウザ版、Androidアプリで提供
 iOS版は開発準備中 • 農業版Redmineに近づいてる
  10. 10. 水稲/コシヒカリ ほ場:A-2 作業予定・記録 日付 作業項目 作業者・作業時間 農薬名・使用量 肥料名・使用量 機械 写真 メモ マスタデータと トランザクションデータ
  11. 11. ファーストバージョン 2012年3月リリース。 画面開いた時にフェッチしてくるやーつ。 =電波がないところでは動かない
  12. 12. 30km (電波が) 試される大地
  13. 13. 気合で同期機能を実装する AlarmManager + IntentService ???
  14. 14. 同期処理に必要なもの • 定期的に、または何らかのキックにより • バックグラウンドで通信を行い • アプリ内のDBを更新する
  15. 15. 2013年スタイル AlarmManager IntentService 頑張ってデータを ダウンロードしてきて INSERTする処理 Intent 定期的に実行
  16. 16. れ出るつらみ • AlarmManagerがときどき消える • IntentServiceが連続で走って止まらない • マルチスレッドでDB叩く状態に突入 • synchronized祭り • ネットワーク有無の検知のために割と頻繁に起動
  17. 17. Androidが提供するデータ同期機能 AccountAuthenticator + SyncAdapter + ContentProvider
  18. 18. AndroidManifest.xml SyncService xml/authenticator.xml <service> xml/sync_adapter.xml <service><provider> authorities ContentProvider SyncAdapter contentAuthority accountType accountType onPerformSync() 同期処理を実装 SyncAdapter利用の最小構成 クラス ファイル パラメータ 凡例: AuthenticationService AccountAuthenticator
  19. 19. 本当に大事なのは onPerformSyncの中で何をするか public class SyncAdapter extends AbstractThreadedSyncAdapter { // ... @Override public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { /* Elegant Synchronization */ } // ... }
  20. 20. 設計を分けれるの嬉しい ContentProvider SQLite Data Access Object UI付近のコード SyncAdapter API Client AccountAuthenticator AccountManager
  21. 21. 使ってる人が少ない気がする
  22. 22. ドキュメンテッドになったのが 割と最近? 2013年まで公式ドキュメントなかったっぽ い・・・?(Web Archive調べ)
  23. 23. 突然情報が出始めた 2009年 2010年 2011年 2012年 2013年 2014年 Android 2.0 Google I/Oで言及 50 Android Hacks 公式ドキュメントが公開? 50 Android Hacks日本語版 mixi-inc/AndroidTraining 弊社もこの頃から 触り始めた
  24. 24. 同期アルゴリズムの検討
  25. 25. 参考にした資料 • 50 Android Hacksのサンプルコード • https://github.com/Macarse/50AH-code/ • Hack 23(Pythonサーバー付き) • Evernote Synchronization via EDAM • https://dev.evernote.com/intl/jp/doc/articles/ synchronization.php • https://github.com/ninjinkun/EDAMSync/blob/master/EDAM- Japanese.md (日本語訳)
  26. 26. 採用した仕組み • Full Sync, Incremental Sync • StatusFlag("dirty" flag)
  27. 27. Full Sync, Incremental Sync サーバー クライアント 1 2 3 1 2 3 1 2 3 1 2 3 Full Sync Incremental Sync
  28. 28. 差分を請求する id data modified_at 1 hoge 10:00 2 fuga" 12:00 3 piyo" 15:00 4 hogehoge" 20:00 http://hoge/hoge?modified_after=13:00 last_fetched = 13:00
  29. 29. StatusFlag ("dirty" flag) 未同期のクライアント環境でデータに変更が あったことを表すフラグ
  30. 30. 4つのStatus CLEAN サーバーから受け取ったままの状態 ADD 新規に作成された (まだクライアント側にしかない) MOD サーバーから受け取ったものに変更を施した DELETE サーバーから受け取ったものを削除した
  31. 31. 同期の流れ
  32. 32. 同期の流れ 1. データのダウンロードを行う • 初回はFull Sync, 2回目以降はIncremental Sync 2. サーバーで削除されていたデータをクライアントでも削除する 3. サーバーで更新されていたデータをクライアントでも更新する 4. クライアント側で作成(ADD)・更新(MOD)・削除(DELETE)されたデータ をサーバへ送信する 5. 送信が済んだデータのStatusFlagをCLEANにする 6. last_fetchedを1の時刻に更新する
  33. 33. 競合問題 > 2. サーバーで削除されていたデータをクライアントでも削除する > 3. サーバーで更新されていたデータをクライアントでも更新する 同じデータの削除や更新がサーバーとクライアント両方で行われてい た場合、競合する
  34. 34. 対応策 • 常にサーバー側が勝つ • 送信を諦める • 常にクライアント側が勝つ • サーバーからのデータを捨てる • クライアント側でマージしてからサーバーへ送る • なんとか全部生かす Evernoteはこれ アグリノートはこれ
  35. 35. 同期パターンの確認
  36. 36. まとめ • mixi-inc/AndroidTrainingでSyncAdapterを勉強して • 50AHでSyncAdapterのサンプルを知って • EDAMの理屈を参考にして同期の仕組みを考える • 競合解決の方針はそのサービスのポリシー次第
  37. 37. 最後に ウォーターセル株式会社では、地球人口100億の時 代に見合う食料生産のための農業革命を一緒に引っ 張っていってくれるAndroid/iOSエンジニアを探し ています。

×