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

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

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 をスーパーで
    動かし続けるためにやったこと
    Cookpad Tech Kitchen #23
    2020/01/30
    Naoya Shibahara

    View Slide

  2. 自己紹介
    ● 柴原 直也
    ● メディアプロダクト開発部
    ○ 2018年新卒入社
    ● Android アプリ開発エンジニア
    ● Kotlin
    2
    梨原 @nshiba310 nshiba

    View Slide

  3. 今日話すこと
    ● storeLive について
    ● storeLive を動かし続けるためにやったこと
    ○ データの自動更新(Android)
    ○ オフライン対応(Android)
    ○ 端末の状態把握(AWS IoT)
    ● 今後やりたいこと
    3
    Android 固有の話が多めになります

    View Slide

  4. storeLive
    4

    View Slide

  5. storeLive とは
    ● スーパー等の店頭に設置する縦型55インチの
    大型サイネージ
    ● 収録された映像を再生するだけではなく、
    Live配信に対応
    ● 買い物客が、料理デモンストレーションLive
    に出演している著名人と大画面でリアルタイ
    ムでコミュニケーションが行える仕組み
    ● OS は AndroidTV
    5

    View Slide

  6. やったこと
    データの自動更新
    オフライン対応
    端末の状態把握
    6

    View Slide

  7. データの自動更新
    7
    ユーザーの操作があるのは動画を切り替えるタイミングだけ
    次の動画の切替まで選択した動画をループで再生し続ける

    View Slide

  8. 動画の自動更新
    8

    View Slide

  9. 自動更新実装方法
    ● 特定のAPIを叩くポーリングを実装
    ○ デフォルトの間隔は10分
    ○ 取得したデータは DB に保存
    ● API レスポンスに次回の実行時間が含まれていた場合にはそちらを優先
    ○ 例:ライブ配信15分前〜ライブ配信終了までは1分間隔でポーリングを
    行いたいため
    ● ポーリングは AlarmManager で実装
    ○ WorkManager は最小実行間隔が15分のため今回は使えませんでした
    9

    View Slide

  10. やったこと
    データの自動更新
    オフライン対応
    端末の状態把握
    10

    View Slide

  11. ネットワークが
    不安定
    11

    View Slide

  12. オフライン対応
    ● ネットワークが原因でアプリが動かない、とお問い合わせが頻繁にあった
    ● ポーリングや動画再生など、ユーザーの操作がない場面でネットワークが必
    要になるので、単純に再読み込みボタンは置くだけでは対処できない場合が
    多い
    ● 端末は固定されていて動かせないのでネットワーク状況が良い場所に移動す
    る、というのはNG
    ● Room + LiveData を使って実装
    12

    View Slide

  13. Room + LiveData
    ● Room
    ○ 取得したデータを DB に保存するのに使用
    ○ 基本的に取得した全てのデータは DB に保存します
    ○ https://developer.android.com/topic/libraries/architecture/room
    ● LiveData
    ○ 動画再生中にデータの変更を通知する手段として使用
    ○ ポーリングで取得したデータを LiveData を使って通知します
    ○ https://developer.android.com/topic/libraries/architecture/livedata
    13

    View Slide

  14. Room + LiveData
    14

    View Slide

  15. Room + LiveData
    15

    View Slide

  16. Room + LiveData
    16

    View Slide

  17. Room + LiveData
    17

    View Slide

  18. Room + LiveData
    18

    View Slide

  19. 表示期間
    19

    View Slide

  20. 表示期間
    20
    オフラインなので情報の取得ができなく
    て動画の更新ができない

    View Slide

  21. 表示期間
    21
    WHERE starts_at <= :date AND :date < ends_at

    View Slide

  22. 問題点 その1
    22
    WHERE starts_at <= :date AND :date < ends_at
    onCreate で一度だけ LiveData を observe するだけだと
    observe した時刻でずっと比較されてしまう

    View Slide

  23. 問題点 その2
    23
    API Request に失敗するので DB にデータが
    Insert されず Activity に動画の更新が通知されない

    View Slide

  24. 24
    class MainActivity: AppCompatActivity() {
    @Inject
    lateinit var movieDao: MovieDao
    private val queryTime =
    MutableLiveData(ZonedDateTimeUtils.now())
    val availableMovies: LiveData> =
    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()
    }
    }

    View Slide

  25. やったこと
    データの自動更新
    オフライン対応
    端末の状態把握
    25

    View Slide

  26. 課題
    ● もともとログのみで端末の状態を把握していた
    ○ お問い合わせがあったらエンジニアが都度クエリして共有
    ○ インターネット接続されているかの確認や正常に動画が再生されている
    かどうかの確認も
    ● 都度クエリをするのはコストが高く、事業側もエンジニアに確認しないとい
    けないので、素早く確認ができない
    26

    View Slide

  27. 端末の状態把握
    ● 素早く、目で見て確認したい
    ● ちょうど storeTV という別のアプリで端末の監視/遠隔操作を実現するため
    にMDMを内製中だった
    ● 当初は storeLive でこの MDM を利用する想定はなかったが、 storeLive
    でも端末の監視/遠隔操作したいという気持ちが高まったので導入
    ● MDM は AWS IoT を用いて実装されている
    27

    View Slide

  28. AWS IoT
    28

    View Slide

  29. AWS IoTで出来ること
    ● Thing(モノ)という単位でデバイスを管理
    ● MQTTを使ってデバイスと通信(JSON)
    ● グループを使った端末の管理
    ● 接続状態の監視
    ● ルールアクションでAWSサービスとの連携
    ● Jobによるタスク管理
    ● デバイスシャドウによる端末状態の管理
    29

    View Slide

  30. MDM でやってることの紹介
    ● MQTT メッセージを使った端末操作
    ○ 再起動、初期化、スクリーンショット送信
    ● ルールアクションを使った端末状態の取得
    ○ 接続状態、バッテリー状態、ストレージ容量など
    ● ジョブを使ったアプリの自動アップデート
    30

    View Slide

  31. MQTTメッセージを使った端末操作
    31

    View Slide

  32. MQTTメッセージを使った端末操作
    32
    管理画面
    Subscribe:
    store-tv/production/cmd/reboot/thing1
    Subscribe:
    store-tv/production/cmd/reboot/thing2
    AWS IoT

    View Slide

  33. MQTTメッセージを使った端末操作
    33
    管理画面
    AWS IoT
    Subscribe:
    store-tv/production/cmd/reboot/thing1
    Subscribe:
    store-tv/production/cmd/reboot/thing2
    Publish:
    store-tv/production/cmd/reboot/thing1
    `

    View Slide

  34. ルールアクションを使った端末状態の取得
    34

    View Slide

  35. ルールアクション
    ● 指定のTopicにメッセージが来たときにAWSサービスを連携させることがで
    きる
    ● Topicを指定するにはSELECT文のようなものを書く
    ○ SELECT * FROM 'store-tv/production/data/device-info/#'
    ● 端末は該当の Topic へ端末の状態を Publish
    35

    View Slide

  36. ルールアクションを使った端末状態の取得
    36
    n 分に1回 Publish
    ・OS/アプリバージョン
    ・バッテリー状態
    ・ストレージ容量
    ・などなど
    AWS IoT Kinesis Lambda
    DynamoDB
    ルールアクション
    SELECT * FROM
    'store-tv/production/data/device-info/#'

    View Slide

  37. ジョブを使ったアプリのアップデート
    37

    View Slide

  38. ジョブ
    ● Thing やグループに対して一連の操作を行うことができる
    ● 端末はジョブ専用の Topic を Subscribe しておく
    ○ $aws/things/{Thing名}/jobs/notify-next など
    ● ジョブのステータスを更新して進捗を管理できる
    ○ 進行中、成功、失敗など
    ● 成功 or 失敗するまでジョブは残ってる
    38

    View Slide

  39. ジョブを使ったアプリのアップデート
    39
    動的グループ
    AWS IoT 管理画面
    S3
    予めAPKを
    アップロードしておく

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  44. 今後やりたいこと
    ● まだ、ネットワークが原因でお問い合わせをいただくことがあるので、さら
    に安定性を高めていきたい
    ● 差込動画や強制動画はポーリングを使って更新しているのを、 AWS IoT の
    デバイスシャドウを使って更新するようにしたい
    ○ まだ、デバイスシャドウに移行したときのメリット/デメリットは調べ
    きれてないので、まだ検討中
    44

    View Slide