OE_uia Tech Blog

ScalaMatsuri / Scala / Android / Bioinfomatics

Scala関西サミットでAndroid Akkaについて喋ってきた話

| Comments

さて、2016年Scalaアドベントカレンダー@Qiita 3日目です。

何を書こうかと考えていたら、そもそも10/8に開催されたScala関西サミットの話をブログに書いてないことに気づきました。

なので今回はそのことを紹介しつつ、色々補足できたらと思っています。

その前に。

Scala関西サミットの感想

時期を逸した感じがしますが(きの子さんすいません…)、去年にも増して楽しかったです!

(結果的に)タイムテーブルの組み方が非常によくできていて、特にB会場のトラックがActorモデルの解説から、Akka-Stream、と続いていき、最後にAkka Clusterの闇の話が入る、という最高の流れでした。

そして日本各地からだけでなく、台湾からの参加者もいらっしゃるなど、多様性という意味でも大きくグレードアップしていました。

これが無料イベントって… 運営のことが非常に心配になりますので、お金払いますから今後もぜひ続けて下さい、という気持ちです。


ScalaMatsuriも負けてられません!

というわけで、ただいまセッション投票の集計&選考&タイムテーブル準備などの真っ最中でございます。

近々、遅くとも年内にはまとまった情報を出せると思いますので、しばしお待ちくださいませ。

僕の主観ですが、今までにも増して豪華で面白いトークの集まる、素晴らしい2日間になると思います。

さて、本題。

Scala関西サミットのスライド

このトークではActorモデルの解説と、ActorモデルがなぜBONXというVoIPアプリにフィットしたのか、という話をさせていただきました。

ただ、あまりAkkaのカスタマイズ性がVoIPのチューニングにどう役立つのか、という話は出来ずじまいでした。 今回はそこにフォーカスをあてます。

非機能要件の改善

VoIPアプリの場合、機能要件の実装・テストより、非機能要件の改善に時間を使います。 具体的には音質と遅延の改善です。

音質の改善

Actorモデルで設計されたVoIPモジュールにおいて何が一番音質の劣化原因になるかといえば、フレーム間で発生した遅延や、フレームの欠落です。

あるフレームが再生されてから、次のフレームが再生されるまでに間に大きく遅延すると、そこで波形が途切れること(非線形)になりますので聴感上ブツッというノイズに感じます。

同様にして、フレームの欠落が起きると、やはり前後のフレームが非連続になりますのでノイズに感じます。

大雑把に言えば、遅延の改善が音質の改善に繋がります。

遅延の改善

では、遅延をどのように改善したら良いでしょう。

安定している条件では、Akkaというより、個々の計算量を減らすなどモジュールごとのチューニングが必要となることが多いです。

しかし音声ストリーム処理の、しかもグループ通話など負荷が時間とともに変わりうる場合だと、Actorシステムにボトルネックが生じることが往々にしてあります。

まず測定・監視して詰まりやすいhotspotになる場所を探し出し、その後で負荷を分散・解消する方策を考え試行錯誤する必要があります。

解決策は十分にdispatcherの並列度を上げる必要があるときもあれば、局所的にActorを並列化するべきなケース、throughtputなどのパラメーターが重要になるケースなど様々です。

Akkaではこういた実行モデルのチューニングの大部分を、confファイルで簡便に変更出来る点で優れています。

また、Mailboxのサイズを適切に設定することも重要です。

小さすぎて溢れるとフレームの欠落になりますし、かといって大きすぎると遅延の解消に時間がかかります。

音声ストリーム処理の改善、とても難しいけど、チューニングがユーザー体験に直結するのはなかなかレアなので面白いです。

そんなAkkaのチューニングをやりたい方、今Androidエンジニアを絶賛募集中ですので、よかったらこちらからどうぞ。

それでは。

Comments