Upgrade to Pro — share decks privately, control downloads, hide ads and more …

storeLive をスーパーで 動かし続けるためにやったこと/What we did to ...

storeLive をスーパーで 動かし続けるためにやったこと/What we did to keep storeLive running at supermarkets

Naoya Shibahara

January 30, 2020
Tweet

More Decks by Naoya Shibahara

Other Decks in Programming

Transcript

  1. 今日話すこと • storeLive について • storeLive を動かし続けるためにやったこと ◦ データの自動更新(Android) ◦

    オフライン対応(Android) ◦ 端末の状態把握(AWS IoT) • 今後やりたいこと 3 Android 固有の話が多めになります
  2. 自動更新実装方法 • 特定のAPIを叩くポーリングを実装 ◦ デフォルトの間隔は10分 ◦ 取得したデータは DB に保存 •

    API レスポンスに次回の実行時間が含まれていた場合にはそちらを優先 ◦ 例:ライブ配信15分前〜ライブ配信終了までは1分間隔でポーリングを 行いたいため • ポーリングは AlarmManager で実装 ◦ WorkManager は最小実行間隔が15分のため今回は使えませんでした 9
  3. Room + LiveData • Room ◦ 取得したデータを DB に保存するのに使用 ◦

    基本的に取得した全てのデータは DB に保存します ◦ https://developer.android.com/topic/libraries/architecture/room • LiveData ◦ 動画再生中にデータの変更を通知する手段として使用 ◦ ポーリングで取得したデータを LiveData を使って通知します ◦ https://developer.android.com/topic/libraries/architecture/livedata 13
  4. 問題点 その1 22 WHERE starts_at <= :date AND :date <

    ends_at onCreate で一度だけ LiveData を observe するだけだと observe した時刻でずっと比較されてしまう
  5. 24 class MainActivity: AppCompatActivity() { @Inject lateinit var movieDao: MovieDao

    private val queryTime = MutableLiveData<ZonedDateTime>(ZonedDateTimeUtils.now()) val availableMovies: LiveData<List<Movie>> = Transformations.switchMap(queryTime) { movieDao.selectAvailableMovies(it) } override fun onCreate(savedInstanceState: Bundle?) { availableArticles.observe(this, Observer { articles -> // update() method を叩くと、ここに新しいデータが来る } } fun update() { // ZonedDateTimeUtils.now().formatString() は現在時刻を String で返す viewModel.queryTime.value = ZonedDateTimeUtils.now() } }
  6. 端末の状態把握 • 素早く、目で見て確認したい • ちょうど storeTV という別のアプリで端末の監視/遠隔操作を実現するため にMDMを内製中だった • 当初は

    storeLive でこの MDM を利用する想定はなかったが、 storeLive でも端末の監視/遠隔操作したいという気持ちが高まったので導入 • MDM は AWS IoT を用いて実装されている 27
  7. AWS IoTで出来ること • Thing(モノ)という単位でデバイスを管理 • MQTTを使ってデバイスと通信(JSON) • グループを使った端末の管理 • 接続状態の監視

    • ルールアクションでAWSサービスとの連携 • Jobによるタスク管理 • デバイスシャドウによる端末状態の管理 29
  8. ジョブ • Thing やグループに対して一連の操作を行うことができる • 端末はジョブ専用の Topic を Subscribe しておく

    ◦ $aws/things/{Thing名}/jobs/notify-next など • ジョブのステータスを更新して進捗を管理できる ◦ 進行中、成功、失敗など • 成功 or 失敗するまでジョブは残ってる 38
  9. ジョブを使ったアプリのアップデート 41 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ

    メッセージ ダウンロードURL が入ってる 予めAPKを アップロードしておく
  10. ジョブを使ったアプリのアップデート 42 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ

    メッセージ APKファイルダウンロード ダウンロードURL が入ってる 予めAPKを アップロードしておく
  11. ジョブを使ったアプリのアップデート 43 動的グループ AWS IoT 管理画面 S3 ジョブ メッセージ ジョブ

    メッセージ ジョブのステータスを更新 成功 or 失敗 APKファイルダウンロード ダウンロードURL が入ってる 予めAPKを アップロードしておく