Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AbemaTVブラウザ版のCDN移行とその活用

 AbemaTVブラウザ版のCDN移行とその活用

2018/07/24 クラウド時代のネットワーク最適化Forum 2018 夏|日経 xTECH主催セミナー
https://project.nikkeibp.co.jp/event/xtechi180724/

Kenichi Kato

July 24, 2018
Tweet

More Decks by Kenichi Kato

Other Decks in Programming

Transcript

  1. 提供プラットフォーム • ブラウザ版 • Androidスマートフォン / タブレット • iPhone /

    iPad • テレビ ◦ Amazon Fire TV / Android TV / Apple TV / Google Cast • VRデバイス • スマートスピーカー VR 6
  2. 開局から負荷対策実施(2017年末) まで 10 2016.04 AbemaTV開局 2017.04 Abemaビデオ リリース 2017.05 『亀田興毅に勝ったら1,000万円』放送

    2017.09 『72時間ホンネテレビ』放送発表 2017.10 全システムで負荷対策を実施 2017.11 『72時間ホンネテレビ』放送
  3. 負荷対策の方針 • キャッシュ可能なもの、または改修によってキャッシュが可能になるものはCDNか らレスポンスを返すように変更 • CDNでのキャッシュヒット率を向上させる • 不要なリクエストの廃止 • 不要なタイミングでのリクエストを適切なタイミングに切り替える

    • 短いポーリング間隔でのリクエストは、間隔を調整 • 別のシステムに切り離せるものは、切り離してオフロード 13 ホンネテレビの負荷対策プロマネのホンネ https://developers.cyberagent.co.jp/blog/archives/12275/
  4. • 配信方式はHLSとMPEG-DASHの2種類 • どちらも、プレイリストとセグメントの2種類のファイルを配信 ◦ プレイリスト: 再生すべきセグメントファイルを記述したもの ▪ デバイス種別や使用できる DRM技術によって、異なるファイルを配信

    ▪ そのためCDNを利用できず ◦ セグメント: 動画の実体 ▪ CDN経由で配信 動画配信の概要(負荷対策前) 15 <前置き:動画配信の CDN利用を見直し> 配信 Akamai セグメント プレイリスト 動画
  5. Webサーバー構成(負荷対策前) 17 Cloud LB Kubernetes Engine Nginx Node.js https://abema.tv •

    GCP上に構築 • BFF(Backends For Frontends) ◦ Nginx → Node.js <前置き:Webサーバーからの配信を CDN経由にする>
  6. Webアプリケーション構成 18 • React + Fluxパターン • Single Page Application

    ※クローラーやSNSシェア向けに、 HTMLはページごとで出し分け デスクトップ モバイル デスクトップとモバイル別にHTML/CSS/JSを用意 <前置き:Webサーバーからの配信を CDN経由にする>
  7. WebアプリケーションにおけるSSR • Server Side Renderingの略称 • ブラウザ向けのJS実装を利用し、サーバー側で初期表示に必要なHTMLを生成 ◦ React /

    Angular / Vue.js などを、Node.jsで実行する • Single Page Applicationとの併用例が多い • サーバーへの負荷が高いため適切なキャッシュコントロールが必要 • 課題に対するメリット ◦ 初期表示用のHTMLが既に生成済みなので、素早く表示される ◦ クローラーなどのマシンリーダビリティが向上する 23
  8. Fastlyを選んだ理由 • 次世代CDNの豊富な機能 ◦ インスタントパージでキャッシュ即削除 ◦ Varnishベースのため、VCLで柔軟なカスタマイズができる ◦ HTTP/2 Server

    Push が使える • 社内での先行事例あり (https://www.superchoice.bet/) ◦ 各種設定を始め、VCLカスタムやノウハウを参考にできそう • 一度は使ってみたかった(チーム一同) ◦ とても大事! 28
  9. 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
  10. Varnish: 設定方法 • FastlyではVCLを直接記述する方法が以下用意されている ◦ カスタムVCL: 独自のVCLファイルを作成することができる ◦ VCLスニペット: カスタムVCLを使わずに、小さなVCLロジックを挿入できる

    • AbemaTVではカスタムVCLを利用 ◦ 要件上は、VCLスニペットでも表現可能 ◦ Fastlyの全設定をTerraformを通して反映しており、 TerraformがVCLスニペット未対応 ◦ 今後の拡張性も考慮 UA別のキャッシュ振り分け 32
  11. 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
  12. Node.js: 識別ヘッダーを使って内部の分岐に利用 UA別のキャッシュ振り分け - X-UA-Device, X-UA-Vendror が共にある場合 - デスクトップ or

    モバイルや、iOS or Android の判定に利用する - SSR結果を変え、Varyヘッダーによりキャッシュもそれぞれで行われる - X-UA-Device, X-UA-Vendror のどちらかがない場合 - リクエスト情報のUserAgentを見て判定を行う(従来通り) - 移行直前や切り戻しで、 Fastlyを経由しないケースにも対応するため 35
  13. オリジンサーバーの要件 • 従来のURL https://abema.tv とは別のURLで提供する ◦ https://abema.tv はFastly用になるため • 通常のアクセスはできないようにする

    ◦ 認証用のリクエストヘッダーを定義 ◦ FastlyのVarnish設定で、オリジンサーバーへのリクエスト時に追加する ◦ オリジンサーバー側でチェックし、無効な場合は 401を返す • Cloud CDNを無効にする ◦ 二重CDNにならないように 37
  14. 稼働状態からの移行方法 • 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
  15. 現在のAbemaTVとCDN(詳細版 - Cloud CDN) Cloud LB Cloud CDN Kubernetes Engine

    Nginx Node.js Nginx for Fastly Fastly https://abema.tv 39
  16. 現在のAbemaTVとCDN(詳細版 - Fastly) Cloud LB Cloud CDN Kubernetes Engine Nginx

    Node.js https://abema.tv Nginx for Fastly Fastly 認証用のリクエストヘッダーを付与 40
  17. 結果(SSR) • First Meaningful Paint(ユーザーに意味のある表示がされたタイミング)が大幅に短縮 ◦ 表示内容をブラウザで生成していたところ、キャッシュされた生成済み HTMLを配信するため • Start

    Render(初回レンダリング開始)などは増加 ◦ HTML自体は大きくなるため • First Interactive(操作が可能になるまで)Fully Loaded(全ての読み込み完了)は変化なし ◦ 最終的に必要なリソースや、処理は変化がないため 変化なし、増加した指標があるものの体感速度が大きく向上 45
  18. 今後の予定 • ブラウザ毎の配信JSの最適化 ◦ サポート状況に合わせたファイルを配信する • HTTP/2 Server Pushの活用 ◦

    JS/CSSファイルの先行キャッシュ • 切り戻し手段の再考 ◦ 現時点では、以前の構成にすぐ戻せる形にしている ◦ 普段使わないファイル群が残ったままになる ▪ メンテが煩雑化、いざ戻した際も動作が保証しきれない 48
  19. まとめ • CDNの導入は恩恵が非常に大きい ◦ 動的に返していたものは、もちろん一工夫が必要 ◦ その過程で既存の問題を見直しや、課題や可能性の発見に繋がった • 複数の選択肢から最適なCDNが選べる ◦

    AbemaTVブラウザ版でいえば、どちらもメリット /デメリットある • クライアントサイドのエンジニアでもCDNは近い存在に ◦ BFFやSSRの普及により、サーバーサイドにも関わる機会が増えている ◦ 同時にキャッシュ戦略も求められるように 49