見出し画像

YYProbeでリアルタイムに情報を共有するために今も試行錯誤している話

はじめまして。YYProbeのサーバーサイドの開発を担当しています、DB(見た目・・・)です。
今回は、YYProbeでリアルタイムに情報を共有するために今も試行錯誤しながら開発を進めている話について書きます。

YYProbeは1人1台の端末を使って会話を記録できるiOSアプリケーションです。複数人で使えば、複数人の会話を話者ごとに記録することができます。
複数人で使うと、リアルタイムにそれぞれの端末の情報を自分の端末で確認することができます。この仕組みは、Ruby on Rails(以下、Rails)のAction Cableを利用して実現しています。

まずとても簡単に、Action Cableとは

RailsではAction CableによってWebSocketによる双方向通信を実現できます。YYProbeでは、各会議ルームに対して固有のIDを持ち、同じ会議ルームに参加する参加者全員に、各ユーザーの情報をリアルタイムにブロードキャストしています。
(実際にAction Cableを使ってみたい方は、リアルタイムチャットアプリを構築するサンプルがRuby on Rails Guides(https://edgeguides.rubyonrails.org/index.html)など、さまざま紹介されています。そちらをご参照ください。)

YYProbeでリアルタイムに共有する情報

現在、YYProbeでリアルタイムに共有される情報には以下のものがあります。
① 発言の音声認識結果(音声認識の途中結果も共有されます)
② 音声認識結果に対するユーザーの修正内容
③ 投稿された画像
④ 削除する発言の情報
⑤ 今、会議に参加しているユーザーの一覧
⑥ 会議に参加している各ユーザーのステータス(マイクのON/OFF、音声認識ON)
⑦ 発言に対するリアクションアイコンの種別
⑧ 発言の集計グラフを描画するための元データ
⑨ ToDoや残しておきたい発言へのフラグ(β版のみ提供しています)
⑩ はけ口さんによる会議への介入情報(β版のみ提供しています)

実際の画面はこちらです。

画像1

画像2

画像7

画像4

画像5

画像6

このようにさまざまな情報があるのですが、最初に試作したとき、私は音声認識された最終結果のみ会議の参加者全員にブロードキャストする作りにしていました。そして、削除する発言の情報や会議に参加しているユーザーの一覧情報は、データベース(DB)に保存し、端末側で都度読み込んでいました。

リアルタイムに情報を共有するための試行錯誤

しかし、いざ試作品を使ってみると、表示される情報にはリアルタイム性が欠けていました。つまり、実際の状況と端末で表示される情報には食い違いが生じていたのです。これでは必要だと思って表示している情報が、逆に誤解を招いてしまう……と感じて、改修することにしました。

まず私がしたのは、ユーザーがリアルタイムだと感じるように、短い間隔でDBからデータを読み込み直す作りに変更することでした。しかし、この方法はDBへの負荷がかかり、運用を考えると現実的ではありませんでした。ここでようやく、都度DBからデータを読み込む方法では解決が難しいと分かったのでした。

そこで、YYProbeの開発に携わって頂いている私の師匠の方々に相談しました。その結果、高頻度で状況が変わる情報はAction Cableに集約する方向で開発を進めることになりました。

解決したかにみえた矢先の試行錯誤

この開発を進めたことで、開発当初の試作品よりも実際の会議状況に合った情報をリアルタイムに共有できるようになりました。それでも時々、実際の状況と端末で表示される情報に食い違いが生じることがありました。
これは、サーバーで受けるデータのバリエーションやアクセス数、同時アクセスが増えてきたことでようやく気付けた問題です(先に把握しておけと言われそう……)

問題の1つは、端末が必ず全てのメッセージを受信できる保証はなく(サーバーダウンや、クライアントのネットワークが切れることもある)、受け取る順序も保証されないことです。
これに対しては、サーバーやRedisを冗長化し単一障害点をなくす、ブロードキャストするデータにタイムスタンプを付与し、クライアント側で順序を保証するなどの工夫をしています。

これからも続く試行錯誤

現在、「はけ口さんによる会議への介入機能」をβ版に搭載してテストしています。この機能は、YYProbeを使って会議をすると、はけ口さんが経過時間や、参加者の発言数の偏りを教えてくれるというものです。
近いうちに、この機能をApp Storeで配信しているYYProbe LITE版にも搭載する予定です。
この機能は私が開発しているのですが、ここでも時々、連続してはけ口さんが介入してしまうという意図しない挙動が見つかっており、コツコツとログを確認しながら改修を進めています。

まだまだ知識が足りない私ですが、今回書いたように試行錯誤を続けてきたことでYYProbeをリリースすることができたと感じています。いまだに不具合が見つかると「早く直さなければ!」と必要以上に焦っている気がしますが、それと同時に、この頃は「もっと勉強しなくては!」という気持ちも湧くようになってきました。

この機会をチャンスと捉えて、私も誰かの師匠になれるよう着実に知識と経験を積んでいこう、このブログも、クックパッド開発者ブログややSmartHR Tech Blogのような記事が書けるよう試行錯誤していこうと思っています。



この記事が気に入ったらサポートをしてみませんか?