Share
Embed
AbemaTVブラウザ版のCDN移行とその活用
2018/07/24 クラウド時代のネットワーク最適化Forum 2018 夏|日経 xTECH主催セミナー
https://project.nikkeibp.co.jp/event/xtechi180724/
Kenichi Kato
July 24, 2018
Transcript
50 slides
-
プロフィール 加藤 賢一(Kato Kenichi)@ktknest 株式会社AbemaTV(株式会社サイバーエージェント) 開発本部 Webチーム フロントエンドエンジニア 2012.06 サイバーエージェントに中途入社
2017.06 AbemaTVに出向 ブラウザ版の開発、リリースマネージャーなどを担当 2 -
アジェンダ 3 • AbemaTVについて • 1. 負荷対策とCloud CDNの導入 • 2.
SSR対応とFasltyの導入 -
AbemaTV(アベマティーヴィー) “ 無料で楽しめるインターネットテレビ局 ” • サイバーエージェントとテレビ朝日が共同制作 • 最新ニュースやオリジナル番組を始め、様々な番組を無料で提供 ◦ 約20チャンネルを24時間365日放送
• Abemaビデオでは、過去放送の番組などの VODコンテンツも提供 5 -
提供プラットフォーム • ブラウザ版 • Androidスマートフォン / タブレット • iPhone /
iPad • テレビ ◦ Amazon Fire TV / Android TV / Apple TV / Google Cast • VRデバイス • スマートスピーカー VR 6 -
システム構成 8 https://abema.tv 多数のマイクロサービスで構成 Web API 配信 ブラウザ アプリ テレビ
Akamai 専用スタジオ 専用スタジオ -
開局から負荷対策実施(2017年末) まで 10 2016.04 AbemaTV開局 2017.04 Abemaビデオ リリース 2017.05 『亀田興毅に勝ったら1,000万円』放送
2017.09 『72時間ホンネテレビ』放送発表 2017.10 全システムで負荷対策を実施 2017.11 『72時間ホンネテレビ』放送 -
負荷対策の方針 • キャッシュ可能なもの、または改修によってキャッシュが可能になるものはCDNか らレスポンスを返すように変更 • CDNでのキャッシュヒット率を向上させる • 不要なリクエストの廃止 • 不要なタイミングでのリクエストを適切なタイミングに切り替える
• 短いポーリング間隔でのリクエストは、間隔を調整 • 別のシステムに切り離せるものは、切り離してオフロード 13 ホンネテレビの負荷対策プロマネのホンネ https://developers.cyberagent.co.jp/blog/archives/12275/ -
• 配信方式はHLSとMPEG-DASHの2種類 • どちらも、プレイリストとセグメントの2種類のファイルを配信 ◦ プレイリスト: 再生すべきセグメントファイルを記述したもの ▪ デバイス種別や使用できる DRM技術によって、異なるファイルを配信
▪ そのためCDNを利用できず ◦ セグメント: 動画の実体 ▪ CDN経由で配信 動画配信の概要(負荷対策前) 15 <前置き:動画配信の CDN利用を見直し> 配信 Akamai セグメント プレイリスト 動画 -
動画配信のCDN利用を見直し 16 CDNを活用した主な対策 視聴数の多い番組ではリクエストがスパイクしてしまう... → プレイリストもCDN(Akamai)経由にする • プレイリストをCDN化するにあたり、ライセンス取得方法などを変更 • キャッシュパターンを整理し、CDNパラメータをチューニング
• 視聴に関するメトリクスが得られなくなるため、別途APIで送信、等 ホンネテレビの負荷対策 -配信編 https://qiita.com/miyukki/items/65028f52765692d9cb98 -
Webサーバー構成(負荷対策前) 17 Cloud LB Kubernetes Engine Nginx Node.js https://abema.tv •
GCP上に構築 • BFF(Backends For Frontends) ◦ Nginx → Node.js <前置き:Webサーバーからの配信を CDN経由にする> -
Webアプリケーション構成 18 • React + Fluxパターン • Single Page Application
※クローラーやSNSシェア向けに、 HTMLはページごとで出し分け デスクトップ モバイル デスクトップとモバイル別にHTML/CSS/JSを用意 <前置き:Webサーバーからの配信を CDN経由にする> -
Webサーバーからの配信をCDN経由にする Cloud CDNでキャッシュ/配信することで、リクエストを最小限にし負荷を減らす • GCP上のため、Cloud LBの設定で容易に導入可能 • UserAgentに関わらず同一の配信内容になるため、依存箇所を修正 19 CDNを活用した主な対策
Cloud LB Cloud CDN Kubernetes Engine Nginx Node.js https://abema.tv -
ブラウザ版のさらなる課題 数ある課題の中で、 • 巨大なSPAにより、初期表示時に時間がかかる ◦ ローディング画面の表示で、ある程度のユーザーストレス軽減は図っているが … • クローラーが正確にHTMLを認識できず、検索エンジンの評価にも影響 ◦
JSの実行結果まで解釈されるが、完全ではない より、 SSR対応を検討 22 -
WebアプリケーションにおけるSSR • Server Side Renderingの略称 • ブラウザ向けのJS実装を利用し、サーバー側で初期表示に必要なHTMLを生成 ◦ React /
Angular / Vue.js などを、Node.jsで実行する • Single Page Applicationとの併用例が多い • サーバーへの負荷が高いため適切なキャッシュコントロールが必要 • 課題に対するメリット ◦ 初期表示用のHTMLが既に生成済みなので、素早く表示される ◦ クローラーなどのマシンリーダビリティが向上する 23 -
Fastlyを選んだ理由 • 次世代CDNの豊富な機能 ◦ インスタントパージでキャッシュ即削除 ◦ Varnishベースのため、VCLで柔軟なカスタマイズができる ◦ HTTP/2 Server
Push が使える • 社内での先行事例あり (https://www.superchoice.bet/) ◦ 各種設定を始め、VCLカスタムやノウハウを参考にできそう • 一度は使ってみたかった(チーム一同) ◦ とても大事! 28 -
TLS 1.0/1.1 が利用できなくなる • AbemaTVの推奨環境で影響がないか確認 • Desktop / iOS 9+
/ Android 5+ OK • Android 4.4 ◦ 標準ブラウザ NG → サポート外とする ◦ WebView(Chromium 30) OK FYI: Android4系端末のTLS1.1&1.2対応について https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b 30 -
UA別のキャッシュ振り分け • Varnish: 設定方法 • Varnish: UAやファイル種類に応じて識別ヘッダーをセット • Varnish: 識別ヘッダーをVaryヘッダーにセット
• Node.js: 識別ヘッダーを使って内部の分岐に利用 31 -
Varnish: 設定方法 • FastlyではVCLを直接記述する方法が以下用意されている ◦ カスタムVCL: 独自のVCLファイルを作成することができる ◦ VCLスニペット: カスタムVCLを使わずに、小さなVCLロジックを挿入できる
• AbemaTVではカスタムVCLを利用 ◦ 要件上は、VCLスニペットでも表現可能 ◦ Fastlyの全設定をTerraformを通して反映しており、 TerraformがVCLスニペット未対応 ◦ 今後の拡張性も考慮 UA別のキャッシュ振り分け 32 -
Varnish: UAやファイル種類に応じて識別ヘッダーをセット 公式のガイドをほぼそのまま使用 https://docs.fastly.com/guides/vcl/delivering-different-content-to-different-devices • X-UA-Device: desktop, tablet, smartphone, native,
na • X-UA-Vendor: generic, apple, android, etc... 画像リソースなどは UA別にする必要がないので一律 X-UA-Device: na とする UA別のキャッシュ振り分け 33 -
Node.js: 識別ヘッダーを使って内部の分岐に利用 UA別のキャッシュ振り分け - X-UA-Device, X-UA-Vendror が共にある場合 - デスクトップ or
モバイルや、iOS or Android の判定に利用する - SSR結果を変え、Varyヘッダーによりキャッシュもそれぞれで行われる - X-UA-Device, X-UA-Vendror のどちらかがない場合 - リクエスト情報のUserAgentを見て判定を行う(従来通り) - 移行直前や切り戻しで、 Fastlyを経由しないケースにも対応するため 35 -
オリジンシールドによるヒット率の向上(未遂) • オリジンサーバーへのアクセスをシールドPOP経由にする仕組み ◦ エッジPOPからのリクエストはシールド POP経由になる • 但し、国内限定では目立った効果がないとのこと ◦ Fastly社からの設定レビューでアドバイスをもらう
◦ エッジサーバーが少ない故(日本では数箇所) ◦ 結果、無効にした https://docs.fastly.com/ja/guides/performance-tuning/shielding.html 36 -
オリジンサーバーの要件 • 従来のURL https://abema.tv とは別のURLで提供する ◦ https://abema.tv はFastly用になるため • 通常のアクセスはできないようにする
◦ 認証用のリクエストヘッダーを定義 ◦ FastlyのVarnish設定で、オリジンサーバーへのリクエスト時に追加する ◦ オリジンサーバー側でチェックし、無効な場合は 401を返す • Cloud CDNを無効にする ◦ 二重CDNにならないように 37 -
稼働状態からの移行方法 • Cloud LBで従来のURLとオリジンサーバー用のURLを設定 ◦ ① 従来のURL: Cloud CDNを有効 -
Nginx ◦ ② オリジンサーバー用の URL: Cloud CDNを無効 - Nginx for Fastly • https://abema.tv のDNS設定で、切り替え・切り戻しを行う ◦ GCP宛: ①で受け、Cloud CDN経由で配信する ◦ Fastly宛: Fastlyで受け、②からリソースを取得し、 Fastly経由で配信する 38 -
現在のAbemaTVとCDN(詳細版 - Cloud CDN) Cloud LB Cloud CDN Kubernetes Engine
Nginx Node.js Nginx for Fastly Fastly https://abema.tv 39 -
現在のAbemaTVとCDN(詳細版 - Fastly) Cloud LB Cloud CDN Kubernetes Engine Nginx
Node.js https://abema.tv Nginx for Fastly Fastly 認証用のリクエストヘッダーを付与 40 -
結果(SSR) • First Meaningful Paint(ユーザーに意味のある表示がされたタイミング)が大幅に短縮 ◦ 表示内容をブラウザで生成していたところ、キャッシュされた生成済み HTMLを配信するため • Start
Render(初回レンダリング開始)などは増加 ◦ HTML自体は大きくなるため • First Interactive(操作が可能になるまで)Fully Loaded(全ての読み込み完了)は変化なし ◦ 最終的に必要なリソースや、処理は変化がないため 変化なし、増加した指標があるものの体感速度が大きく向上 45 -
結果(Fastly) • キャッシュヒット率がAvg 90%以上 ◦ Cloud CDN時はAvg 95% ◦ キャッシュパターン増を考慮しても高め
• 検証期間も問題なく経過 ◦ 切り替えから1週間ほど後、SSRを有効化 46 -
今後の予定 • より細かい分類によるキャッシュの最適化 ◦ 課金プランごとに一部表記が異なる等 ▪ 現在のSSRはどちらにも対応できる形にし、 Clientで再描画を行っている 47 無料ユーザー
有料ユーザー Node.js Fastly Cookie: Premium=0 Vary: Status=Free Cookie: Premium=1 Vary: Status=Premium -
今後の予定 • ブラウザ毎の配信JSの最適化 ◦ サポート状況に合わせたファイルを配信する • HTTP/2 Server Pushの活用 ◦
JS/CSSファイルの先行キャッシュ • 切り戻し手段の再考 ◦ 現時点では、以前の構成にすぐ戻せる形にしている ◦ 普段使わないファイル群が残ったままになる ▪ メンテが煩雑化、いざ戻した際も動作が保証しきれない 48 -
まとめ • CDNの導入は恩恵が非常に大きい ◦ 動的に返していたものは、もちろん一工夫が必要 ◦ その過程で既存の問題を見直しや、課題や可能性の発見に繋がった • 複数の選択肢から最適なCDNが選べる ◦
AbemaTVブラウザ版でいえば、どちらもメリット /デメリットある • クライアントサイドのエンジニアでもCDNは近い存在に ◦ BFFやSSRの普及により、サーバーサイドにも関わる機会が増えている ◦ 同時にキャッシュ戦略も求められるように 49