y.takky てくめも

web技術について勉強会の参加メモだったり、本を読んだメモだったりを載せる予定

Abema TV DEVELOPER CONFERENCE 2017にいってきた

AbemaTV Developer Conference 2017

去年に引き続いて

ytacky.hatenablog.com

Abema TV DEVELOPER CONFERENCEにいってきた。

今回の会場はTECH PLAY. dotsがTECH PLAYに変わってからははじめていったかも。

スライドとかはGoogleの福田さん以外のは順次公開されるはず...

AbemaTVを支えるGoogle Cloud Platform

福田潔さん (Googleの方)

  • CDNはAamai(キャッシュできるコンテンツ)
  • GCPではGLBで受けてバックエンドに流す。
  • マイクロサービスとしてGKEを使ってる。
  • GAEとGKEの違い
    • GKEはkubernetesのマネジメントサービス
    • GAEは制約が強いが動作環境自体のマネジメントはない。
  • Kubernetesはデファクトスタンダードになった。
    • Dockerもついにkubernetesをネイティブ Sawrmの併用も可能に
  • SREはソフトウェアエンジニアとしての力も持っているし、運用もできるというのがGoogleのSRE
  • GKE
    • Googleが制御プレーンを管理する
    • Master側はGoogleが管理する。 99.5%SLA
  • ノードアップグレード
    • kubernetesのバージョン
    • nodeOS
  • Backendはマネジメント使えば
  • GLB
    • BackeEndで振り分けられる
  • グローバル負荷分散
    • 自分の近いところにアクセスが行く。
  • Cloud LB / CDN

まとめ

福田さん自体は結構いろんなカンファレンスで話聞くことがあって、GCP周りの話に関しては結構調べれば出てきそうな感じかな。 あとAbemaTVの事例は Google Cloud Nextでもあったのでそっちの動画はみないとなーと。

(たしかこれ会場にいってたのに障害対応してた気がする..)

AbemaTV将棋チャンネルの配信技術 〜全国完全生中継への挑戦〜

藤崎さん

既存の中継

FPU(マイクロ波) で送信

  • 専用線で秘匿性高いが免許必要だし高い。
  • アンテナ合わせ...

衛生

  • 遅延が多い。専用線だけど
  • 天候に左右される

SKYPE

  • 簡単で画質そこそこだけど不安定でPCベース

SkypeTx

  • 放送用Skype , 画質Max720p 遅延が少ないが相手先のネットワークに左右される

LiveU

  • イスラエルが作ったやつ
  • キャリアを束ねて分散して送信して受け元で戻すやつ。
  • クラウドで動いていて位置もわかる

  • AbemaTvはLiveUの保有2位

  • 簡単,フルHD、圏外問題はある

実際の将棋中継

  • 2ヶ月前から設定する。
  • 電気食うから発電機必要
  • リピータも借りている

まとめ

  • 放送1日でも実際は3-4日
  • 平均2時間のカメラ調整

AbemaTVの画質定義~ラウドネスマネージメント(録画放送)

  • 配信レゾリューション (配信サイズ) は多々。近々情報量節約モードが出る

技術用語

  • CODEC
    • 圧縮 , 符号化 / 復号化
  • container / 拡張子
    • 映像と音の入れ物のイメージ
      • コンテンツプロバイダーからの入稿規定がある。
    • mp4ならばH.264 / AAC-LCなどの圧縮系
    • masterデータの場合もある。 / Prores422HQ / リニアPCM
  • TRASCODE
    • 頂いたデータを配信用データに変換する
    • 容量負荷の軽減と品質担保を保つ

中間ファイル作成

 - DDP (ウォッチフォルダー運用)

配信トランスコード

 - 速度と品質はトレードオフ。ユーザーファストで

ラウドネスマネジメント

 - CMと本編の音量差を解消するために策定された。
 - AbemaTVではこれを独自にモディファイ / 音量大きめで出力している     
 - 国際的議論があったり最適化をプロ(テレ朝)と話してる
 - 将棋や麻雀のように喋っている部分が短いところは難しい。基準を変えて測定する

AbemaTV モバイルアプリの開発体制と開発プロセスの話

開発体制

  • 開発局50人
  • チームは別れている
  • ビデオ/グロース/本質改善/テレビデバイスの4つに分けている。

repositories

-ios - tvos -api -protobuf-swift -script -その他 7~8 PR / 営業日

開発フロー

  • スクラム開発
    • 2週間スプリント
    • 2wで修正
  • 開発を2週間, QAを1週間でやってたけど、開発とQAの重複がつらい
  • 開発1w,QA 1wにしてる。

タスク

  • プロデューサー / プランナーが立案
  • 実現されるための機能を上げる

  • エンジニアがコード品質やパフォーマンス化タスク化。

タスクの見積もり

  • ストーリポイントは1人1人の

タスクの優先度

  • ↑SAB/↓CD
  • ↑ スプリント機関に開発完了 / テスト / リリース必須 定常リリース日に間に合わなければ遅らせる判断
  • ↓ 後回しでもoK

会議体

  • スプリント計画
  • スプリントレビュー
  • 案件会議

ツール

  • Slack
  • Jira
  • Confluence
  • esa
  • Gtihub
  • Bitrise
  • Jenkins
  • cmdshelf

開発スタイル

  • CONTRIBUTING.md
    • 3人以上からOK
    • 軽微なら2人とか
  • テストは極力書く
    • UI周りは設計でカバーして、テストは書かない方針

ブランチ戦略

  • 基本はGithub Flow
  • 開発用のmasterとqa branch

Beta配信

  • GithubにPR / bitriseがjobをキック。 Crashlytics, Itunes ConncectでTestFlight配信

Slack通知

  • K.I.T.T -レビューがされていないPRを流す

QA効率化

デザインのBefore & After

  • アプリ内通知バー
    • AndroidのSnack Barと同じデザインにしたい
    • 指が届かない
  • モーダル

    • フルスクリーンのモーダルは避けられる傾向がある
    • 指がと説かない
    • AndoidのBottom Sheetと同じUX
  • ビデオページ

    • サムネイルのパワーが弱いので文字で訴求したい
    • 情報量のバランスを取るため
  • アプリアイコン

  • Web(モバイル)

    • モバイルページはアプリへの導線的な役割
    • 番組ってことをわかるようにサムネ大きくした
    • 放送中の番組のページだけダウンロード率が少し低かった
    • twitterからの流入のダウンロード率がちょっと低い
      - リンクを踏むとその時放送中の番組になっていた
      - 番組それぞれ持つIDに変更
      

AbemaTVにおけるモニタリング

 - LE VAN NGHIA(ギアさん)

サービスから見る

  • K8s Statelessなマイクロサービス -GCE Node (Stateful)
  • その他GCPサービス

モニタリングサービス

  • StackDriverのみ
  • マシンメトリクス(CPU/Memory/Network)

全てのレイヤを監視したい

Prometheus + Grafana

  • Kuebernetesと親和性が高い
  • 性能が良い

Prometheusの導入

 - クラスタ内に1つのPrometheus
 - Grafana側で複雑なQueryを書くと待ち時間が長い
 - PrometheusでRecording Rulesを追加して良くなった
 - ただ問題と課題が上がってきた

時系列データの増加

 - モニタリングターゲットの増加
  - 新しいメトリクスが増えた

Node-exporter

 - CPU / Memory ./ Disk / Network
 - DaemonSetとして書くnodeに1つのpod
 - GCEの場合Packer

k8sのメトリクス

 - kube-dnsなど

CCUメトリクス

 - 同時接続数にメトリクス
 - アクセスログからリアルタイム計算
 - HyperLogLogアルゴリズム
 -Horizontal Pod Autoscalerで自動スケーリング

Prometheus sharding

 - メトリクス首里でPrometheusを分ける

HA Prometheus

 - 同じconfig / 同じターゲットリストで複数Prometheusを構築
 - データの差分の吸収

Prometheus Operatorを導入した

  • configの代わりに server-monitorを記述した
  • ほっとリロード Sidecarコンテナでconfig/dashboard監視

問題

  • k8sの必要なyamlファイルの重複
  • DRY などに対応するのにHelmを導入した

Helm

  • kubernetes package manager
  • Helm Chartを作成してvalueに差分だけ与えればOkになった。
  • Prometheusを使った分散トレーシングにPromvizを作った。

Microservices下におけるWebの負荷対策

  • GLBで受けてGKEにmicroservicesが載っているという他と同じ構成
  • Backend health / Timeout : 10s Internal 15s
  • Nginxがassets系の配信をしている
  • htmlのmeta情報はgrpc通してbackendから返している、

最初のランディングはabema.tv別ドメイン - フロントエンドエンジニアはUI/UXに専念したい。 APIGatewayは別ドメイン

障害原因

ケース1

  • API Requestが200を返さず、ErrorPageを出すか、不必要なまま出す
  • つまりランディングに必要なAPIが叩けないと死ぬ

ケース2

  • Node.jsにはタイムアウトの実装がなかった
  • GLBがtimeoutすると503帰ってくる

ケース3

  • API Requestが通らない
  • いわゆるnginxが詰まった。

対応策

  • エラー処理を実装した
  • gRPCコールしているところにデフォルトタイムアウトを実装する
  • Webのサーバリクエストをスケーリングさせる

CDNを通すようにする

  • パフォーマンスと可用性
  • 欠点は細かい振り分けができない

制約も多いがパフォーマンスにおける利点が多いが何より可用性が維持できる

新しい構成

  • CloudCDNを頭につける
  • UAごとの出し分けはやめる。

Webのパフォーマンス

  • Service Worker有効時の First Meaningful Paintが遅い

対応策

  • Server Side Rendering
  • JSファイルの分割と動的インポート

まとめ

  • 運用においての負荷対策は登竜門的なようなもの

AbemaTVを支えるアプリの優しさ

  • バッテリーを使わないとかネットワークをあまり食わないとかはアプリとして大事
  • システム的に見てもネットワーク帯域を使わない。というのも大事

現状の問題

  • HLS(HTTP Live Streaming)
  • playlistとりすぎ問題があった。
  • 通常はMEDIA-SEQUENCEをインクリメントして次の.tsを取りに行く
  • Playerのバグの問題(PR送った)

画面に最適なビットレート制御

  • Andorid 7.0からは複数画面視聴もできるようになった。
  • 端末や画面幅で切り替えた。

MPEG-DASHによるリニア型配信

  • TECH PLAY TECH CONFERENCE 2017 の記事見るといい

HLSとは

  • Appleが提唱したHTTPストリーミング規格
  • HLSサポートプレイヤーが増えた
  • マスタープレイリスト

MPEG-DASHとは

Dynamic Adaptive Streaming over HTTP - ISO/IECが企画したHTTPストリーミングを行う規格 - 各ベンダー(apple,adobeのHDSなど)が作った規格の統一のため

MPDとは

Media Presentation Description - メディア記述のXMLファイル

プロファイルが何故必要化

  • 対応しているメディア形式を決めておいてプレイヤーがサポートする規格を制限できる

M4Sとは

  • フラグメント(セグメント)化されたMP4ファイルのこと

AbemaTVのリニア配信

  • リニア配信とは
    • 予め番組表に従って行う配信
  • 番組表に従って録画,生放送,CM,フィラーを配信する

なぜMPEG-DASH対応するか

  • DRM対応コンテンツの配信が必要
  • 各デバイスごとに配信方式変えている

配信品質の監視

  • マスタールームで監視しているけど24h監視は辛い
  • HTTPステータスコード監視入れるけどストリーミング監視には役立たない

監視ツールをつくった

  • Procyon ー社内OSS的な

AbemaTVの裏側 - 大規模トラフィックを支える技術と負荷対策の話

負荷試験

  • Locust & wrk

Locust

  • Python製の分散型ユーザ負荷テストツール
  • abemaTVでは GKE上で大量のdestibuted mode workerを配置してシナリオファイルを回して、high-throughputを実現している。
  • machine Type n1-high-cpu-16, Node 104*3 , pod 5000
  • Total 9984 Core
  • GKE x Locustの相性が良い
  • WebUIから各pathのreq/secやexptionを観測できる
  • 自由度が高いゆえに秘伝のたれ化
  • 9984コア要らない説
  • 負荷試験環境の実行やレポートの週家まではChatOps化
  • boomerを使用したシナリオreplace
  • 1つのendpointに対しての限界性能試験ではちょっと...

wrk

  • Lua製のHTTPベンチマークツール
  • 単一のマルチコアCPU上で実行すると大規模な負荷与えられる
  • レポート出力はカスタムできる
  • Luaなので高速かつパワーも十分
  • ちょっとしたシナリオも記述可能
  • latencyのpercentile表示
  • threadとconnectionのバランス表示
  • レポートの集計には弱い

Bihind-thesceenes story

MongoDB

  • MongoDB Cloud Manager
  • Restore
    • Cloud Managerのsnap shotを取るようにした
    • 実行時間が1/2に
    • Restore時はwrite防止の為mongoを止めるのでオンラインでは使用できない

Cloud Bigtable

  • Backup

    • Cloud Dataflowを使用してテーブルを一連のHadoop シーケンスファイルとしてexport
    • Hbase -> BigTableインポートもOK
  • Metrics

    • StackDriverでの表示はGA
    • ただしDashboardからBigtable MetricsにアクセスするためにはWhitelist申請が必要

その他

  • Abema Bot

    • 負荷試験環境は本番とほぼ同じ、 使用するときしか起動しない運用
    • 検証のときでも使ってるが人力ではカバーしきれない
    • 定時のタイミングでBotを動かしてインスタンスの停止を通知する
  • Varnishを通しているendpointやcache可能なendpointはCDNを導入