さて、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エンジニアを絶賛募集中ですので、よかったらこちらからどうぞ。
それでは。