二週間でつくる、Peing-質問箱-の動画配信プラットフォーム

こんにちは、大平(@yohira_dev) です。

今回の記事では、株式会社ジラフで開発・運用しているWebサービス「Peing-質問箱-」における動画・音声回答の設計・実装基盤について書いていきたいと思います。

匿名質問サービス「Peing-質問箱-」では、これまでテキストによる回答のみが可能でしたが、60秒以内の動画および音声での回答を行うことが可能になりました。

事前に収録した音声・動画ファイルで回答するだけでなく、ブラウザからその場で録画・録音することも可能となっています。

「Peing-質問箱-」にて60秒以内の動画・音声コンテンツによる回答機能をリリース、サービス収益化の布石へ


質問箱は音声・動画回答の実装前からPV月間1億以上、DAU10万人以上、同時接続数10000人以上のユーザー規模を持つWebサービスであり、混雑時の負荷を軽減するために様々な施策を実行してきました。

音声・動画はプレーンテキストよりも扱う容量が多いので、性能について十分な考慮が必要となります。

とはいえ、質問箱も2017年11月にリリースされたばかりの若いサービスであり、当然スピード感を持った機能開発が求められます。

本機能の実装においては「Webサービスに求められるスピード感」と「シビアな性能見積もり」を両立することが求められました。


どうやったか

ローンチ速度と性能要件の充足を目指すため、AWSのマネージドサービスを最大限活用しました。

大まかな機能の実装方針は以下のようになります。

  1. ユーザーがアップロードした動画・音声をS3に送る
  2. S3への動画・音声のアップロードにフックしてAWS Lambda関数をコールし、ElasticTranscoderでファイルを圧縮
  3. 圧縮したファイルをS3に配置してユーザーが再生できるようにする

AWS S3の活用

ファイルストレージとしてはAWS S3を利用しました。これによって、従来のオンプレミスやVPSでの「ファイルストレージがいっぱいになる」「負荷が集中して落ちる」問題から解放されます。

余談ですが、Rails 5.2.0から「ActiveStorage」という機能がRailsに導入され、クラウドストレージの取り扱いがフレームワーク標準でサポートされるようになりました。質問箱ではCarrierWaveというGemを使っているのですが、機を見て移行を行っていきたいですね。

Active Storage Overview — Ruby on Rails Guides

AWS Lambdaの活用

当初、「動画圧縮用のサーバーを立てる」ことも想定しましたが、スケーラビリティ・保守性・信頼性などを考慮するとAWS Lambdaの活用が合理的であるという結論に至りました。

Lambdaは「S3に特定形式のファイルがアップロードされた場合に実行する」など、S3との連携もシームレスに行うことができます。(動画・音声回答機能ではこの機能を使っています)

AWS Elastic Trancoderを用いた圧縮・軽量化

ユーザーがアップロードした音声・動画ファイルはそのまま扱うとファイル容量が大きすぎるので、適切に圧縮をかける必要があります。

今回はAWSのフルマネージドサービス「ElasticTranscoder」を使用しました。

ElasticTranscoderは、予め用意されている動画・音声の変換設定(プリセット)から設定を選択することで、いい感じにファイルを圧縮してくれます。

これによって、音声・動画の劣化を最低限に抑えながら、生ファイルをそのまま配信した場合の1/10程度にまで転送量を抑制できています。

ElasticTranscoderは従量課金制のサービスですが、S3の転送量を軽減することによって使用料金が下がるので、トータルコストは下げることができます。


上述した構成において、S3,Lambda,ElasticTranscoderが高負荷マターで落ちるようなことはなく、今のところ安定して運用できています。

今後の構想となりますが、配信基盤を同じくAWS CloudFrontの基盤に乗せることで、さらに高速・高信頼性・低コストを実現できると考えています。

また、並行して質問箱のアプリケーションサーバーもVPSからKubenetesへの移行を進めており、さらなる負荷増大にも柔軟に対応できるようなサービスアーキテクチャを目指しています。

告知

株式会社ジラフでは一緒にプロダクトを開発していく仲間を幅広く募集中です。

丸ノ内線・大江戸線の方必見!中野坂上のスタートアップで開発しませんか?

世界に向けてフルスタック技術を活かしてサービス開発したい方をWANTED