(2019/04 追記 AbemaTV Developer Conference 2018 で発表しました。資料 や ログミーの記事 はこちらです)
この記事は、AbemaTV Advent Calendar 2017 の1日目の記事です。このアドベントカレンダーは、AbemaTVで働くエンジニア・クリエイター・ディレクター有志で更新をします。レギュレーションは特に無く、職種も様々ですので、毎日雰囲気は異なると思いますが、そこも楽しんでいただければと思います。25日までどうぞよろしくお願いします。
今日は、2011年新卒入社でインフラエンジニアの柿島大貴が担当します。8月末からAbemaTVにジョインをして、負荷対策のプロジェクトマネージャーとして働いています。
先日の 稲垣・草彅・香取 3人でインターネットはじめます『72時間ホンネテレビ』 (以下、ホンネテレビ)に向けた負荷対策の取り組みについて、具体的な数値やグラフを出せずに申し訳ないのですが、大枠でどのような負荷対策を実施したか、プロジェクトマネージャーとしてどのようなプロジェクトの進め方をしたかについて書かせていただきます。
負荷対策の方針
負荷対策は、特別な技術による解決ではなく、一般的な負荷対策を粛々と実施しました。
主要な対策としては、サーバーまで到達するリクエストを極力減らすことで、1デバイスあたりの起動や視聴のサーバ負荷を減らすことを目指しました。対策の期間は限られていたので、特に視聴に影響する部分、全体に占める割合が高いもの、スパイクを発生させる可能性が高いものを優先して対応をしました。
- キャッシュ可能なもの、または改修によってキャッシュが可能になるものはCDNからレスポンスを返すように変更
- CDNでのキャッシュヒット率を向上させる
- 不要なリクエストの廃止
- 不要なタイミングでのリクエストを適切なタイミングに切り替える
- 短いポーリング間隔でのリクエストは、間隔を調整
- 別のシステムに切り離せるものは、切り離してオフロード
キャッシュができないリクエストやCDNからのオリジンアクセスについては、以下の方針で対応をしています。
- 負荷試験とその結果をもとにしたサーバーの一定のキャパシティ確保
- 負荷試験については @rm_rf_slantさんの発表資料 AbemaTVの裏側 もご覧ください
- 特定部分の高負荷時に視聴まで影響が及ばないようなサーバ構成の変更や、サーバー/クライアント側でのエラーハンドリング
- 1つの例として、 @asukaleidoさんの発表資料 Microservices下におけるWebの負荷対策で、Webの過去のイベント時に問題のあったエラーハンドリングやタイムアウトについての改修を紹介しています
それ以外に、直接の負荷対策ではありませんが、問題の早期解決やユーザ影響の軽減に向けて以下のようなことにも取り組みました
- モニタリングの強化
- システムのモニタリングについては @nghialv2607さんの Monitoring at AbemaTV をご覧ください。このモニタリングの仕組みはエンジニア内でも好評です。
- 配信品質の管理については、@toriimiyukkiさんの MPEG-DASHによるリニア型配信という発表資料の後半にある配信品質の管理をご覧ください。CDN化時のトラブルシューティングに役立ちました
- どういった部分にリスクがあるかの共有
- 問題発生時のエスカレーション方法や、当日の体制づくり
- 一部機能での縮退プランの用意
- エラー画面等の整備
負荷対策の副次効果としては、サーバーへのリクエストが減ったことや、CDN経由ではないインターネットへのデータ転送量が減ったことでコストの改善効果も出ています。今回、優先度が高い部分は、ホンネテレビまでに対策をしましたが、まだ対策が終わっていない部分に関しては、同じような方針で、年末年始やその後に向けた改善を続けています。
プロジェクトをどう進めたか
突然のAbemaTVのプロジェクトマネージャーとしてのアサイン、初めてのプロジェクトマネージャーということで右も左もわからない状態だったので、童話でわかるプロジェクトマネジメント で概要をつかみ、直前まで輪読会で読んでいたSite Reliability Engineeringに書かれているLaunch Coordination Engineeringに影響を受けたりしながら、「チームで成果を出す」ために自分なりの解釈でプロジェクトを進めていました。
最終的にはプロジェクトでは、以下を主に担当しました。
- 全体スケジュールの調整
- タスクごとの依存関係の把握
- サーバー、クライアント、インフラのリリースや変更タイミングの調整
- 大まかな進捗状況の確認
- マネージャーとエンジニアやディレクターの間、ディレクターとエンジニアの間、クライアントエンジニアとサーバーサイドエンジニアの間、運用チームや他部署との間、ベンダーとの間での調整役
- ログの調査やリクエストのキャプチャをはじめとしたネガティブチェック
- プレゼン資料の作成
- 試算、モニタリング、試算、モニタリング …
プロジェクトマネジメントとは、要は「チームで成果を出す技術」です。
プロジェクトマネジメントを知ると、いろいろな人との仕事がうまくいきます。
ひとりぼっちにならず、チームで助け合いながら課題に取り組めます。
きちんと計画することで、トラブルを未然に防げます。
プロジェクトの状況を見える化することで、問題の発見と対策、改善を可能にします。
そして、最初に決めた目的を、きちんと達成することができます。
各時期にプロジェクトマネージャーとしてやっていたことを振り返ってみました
ジョインからキックオフまで
- メンバーの名前、Slackアカウントや座席の場所などを少しずつ覚える
- ドッグフーディング
- ドキュメントを読む
- 仕様やAPIドキュメントの確認
- サーバー側の調査
- 過去のイベント時や最近のログ、メトリクスの確認
- クライアント側のリクエスト調査
- PCブラウザ、iOS、Androidのアプリケーションがそれぞれどういったタイミングでどのようなリクエストをしているかをブラウザのデベロッパーツールや Charles を利用して調査をしました。特に、特定のクライアントアプリだけが別の挙動をしている場合や、アプリケーションの動作としては問題がなくてもリクエストが多い場合などは注意深く見るようにしました
- 結果的に、@ogaclejapanさんが AbemaTVを支えるアプリの優しさ で発表された プレイリスト取得し過ぎ問題のような問題を洗い出すことができました。その後、AndroidチームがExoPlayerの不具合を特定、修正してくれて問題解決
- クラウド、CDNベンダーとの連携
- AbemaTVではAkamai様やGCP様、連携システムでAWS様などを利用しています
- キャパシティの調整、制限(Quotaなど)の再確認
- 構成変更やチューニングの相談等
- 関連部署との連携
- 別部署が管理するシステムとの連携
- 試算、案だし
- 実績をもとに想定される負荷時にリクエストがどうなるかの試算、改善案の作成
- マネージャーへのヒアリング
- 各種想定数
- どこが重要か、MUST, SHOULD, WANTで守るべき機能のレベル分け
- 不安に感じていること
- ディレクター、エンジニアへのヒアリング
- 仕様の確認、試算の方向性が間違っていないかの確認など
- キックオフ
- 「どれだけ高いハードルを短期間で超えようとしているか」「そのために、何をしなければいけないのか」を話し、モチベーションを上げること、メンバーのベクトルを同じ方向に合わせることを目指しました
- 年末年始に向けたキックオフだったのですが、その後すぐにホンネテレビの告知がありました。期間は短くなったものの、対策しなければいけない部分は変わらないので、大きな方針は変えず、他の案件をやっていたメンバーを負荷対策に寄せてもらう形でほぼ全員での負荷対策となりました。
仕様決めから進捗確認まで
- 改善したいポイントは伝えた上で、細かな仕様の決定、担当者のアサインはディレクターや各担当に任せることにしました
- 何度も説明してもらわなくても話が理解できるように、案件ごとのミーティングにできる限り参加
- タスクごとの依存関係の把握、クリティカルなタスクの進捗状況の確認、リリースするタイミングの調整に注力
- 新しい仕様を元に再試算
QAテスト~リリース後
- 想定した仕様になっているか、新しい問題が増えていないかQAチームと並行してリクエストの観点から確認
- 特に審査で時間が必要なiOSは、再申請が難しい可能性を考えBeta配信時に重点的に調査
- Beta配信に関しては、@dekatotoroさんのAbemaTV モバイルアプリの開発体制と開発プロセスの話もご覧ください
- サーバーやCDNのログやメトリクスから、意図したリクエストの削減となっているか、新しい問題が発生していないかの確認
- リリースによる問題発生時のエンジニアとの相談や調査
- イベント当日のシフト作成
- 開発側のエスカレーションフローの整備
- 実際のデータを元に再試算
当日
- シフトを組んで交代しながらシステムのモニタリング
- 開発以外のチーム(プッシュ通知やサイマル放送、連携システム等)との連携
後日
- 当日のログやメトリクスの確認
- 年末年始に向けた試算、計画
ホンネテレビを終えて
厳しいスケジュールの中、対策を間に合わせてくれたプロジェクトメンバーは最高でした。 また、社内、社外含め多くの方に負荷対策にご協力をいただきました。ありがとうございました。
ホンネとしては、チャレンジに対する楽しさが半分、めちゃくちゃ不安な気持ちが半分(心配性のため)でしたが、無事終わってホッとしています。今回はプロジェクトマネージャーとしての役割でしたが、普段インフラエンジニアとして働いていると目指すべきサービスの状態は何事もなく稼働していることで、どちらかといえば注目されるのは問題発生したときのほうが多いです。今回のイベントではダウンしなかったことがニュースになるという経験が出来て非常に嬉しかったです。ただ、立ち止まっていることはできず、すぐに年末年始が待っているので、引き続き改善を続けていきます。
最後に、我々は共に「サイバーエージェント」「AbemaTV」を成長させてくれる方を募集しています! 「21世紀を代表する会社」「インターネット初のマスメディア」を一緒に創りましょう!
読んでいただきありがとうございました。
CyberAgent Developers Advent Calendar 2017 こちらもよろしくお願いします