Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
3周年に突入するAbemaTVの挑戦と苦悩 / The challenge and anguish of AbemaTV celebrating the third anniversary
Yusei Yamanaka
February 15, 2019
Technology
8
3.8k
3周年に突入するAbemaTVの挑戦と苦悩 / The challenge and anguish of AbemaTV celebrating the third anniversary
Yusei Yamanaka
February 15, 2019
Tweet
Share
More Decks by Yusei Yamanaka
See All by Yusei Yamanaka
生配信管理システムのバックエンド〜AWS AppSyncで迅速に構築するGraphQLサービス〜 / Backend of live streaming management system - GraphQL service to build quickly with AWS AppSync
miyukki
0
210
"新しい未来のテレビ"を目指すABEMA配信システムの再設計 / Re-architecture of ABEMA live ingest system
miyukki
0
1.7k
AbemaTVのアーキテクチャの変遷 / The history of AbemaTV's architecture
miyukki
3
970
機材管理ツールをFirebaseで構築しようとした話 / Building equipment management software with Firebase
miyukki
7
3.7k
AbemaTVで働くエンジニアの裏側 / The engineer working at AbemaTV
miyukki
0
690
動画配信サービスとしてこの先生きのこるには / The way to continue as a video streaming service
miyukki
8
3.3k
MPEG-DASHによるリニア型配信 / Linear broadcasting by MPEG-DASH on AbemaTV
miyukki
6
12k
1周年を迎えたAbemaTVの動画配信の裏側 / The background of video distribution in AbemaTV during one year
miyukki
15
11k
映像制作現場における高解像度映像IP伝送装置の提案と実装 / Proposal and Implementation of Delivery System for High Resolution Video at Video Production Site
miyukki
0
120
Other Decks in Technology
See All in Technology
成長を続ける組織でのSRE戦略:プレモーテムによる信頼性の認識共有 SRE Next 2022
niwatakeru
7
2.2k
220510 プロセスマイニングを学ぶ PLAY与田さん
comucal
PRO
0
570
プロダクトグロースと技術のベースアップを両立させるRettyのアプリ開発スタイル / Achieve Product Growth and Tech Update
imaizume
1
260
Motto Go Forward スライドトップと Goを支える文化とコミュニティ してご利用ください 〜なぜ我々はコミュニティにコントリ ビュートするのか〜
luccafort
0
170
1年間のポストモーテム運用とそこから生まれたツール sre-advisor / SRE NEXT 2022
fujiwara3
5
2.8k
暗号資産ウォレット入門(MetaMaskの入門~NFTの購入~詐欺の注意事項など)
kayato
2
160
Building smarter apps with machine learning, from magic to reality
picardparis
4
3.1k
Adopting Kafka for the #1 job site in the world
ymyzk
1
260
jaws-ug-asa-datasync-20220510
hiashisan
0
460
TypeScript 4.7と型レベルプログラミング
uhyo
5
2.9k
長年運用されてきたモノリシックアプリケーションをコンテナ化しようとするとどんな問題に遭遇するか? / SRE NEXT 2022
nulabinc
PRO
15
7.1k
220428event_ogura_part
caddi_eng
0
180
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
113
6.9k
A designer walks into a library…
pauljervisheath
196
16k
GitHub's CSS Performance
jonrohan
1020
410k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
The Most Common Mistakes in Cover Letters
jrick
PRO
4
24k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
3
430
Typedesign – Prime Four
hannesfritz
33
1.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
38
12k
From Idea to $5000 a Month in 5 Months
shpigford
372
44k
Intergalactic Javascript Robots from Outer Space
tanoku
261
25k
Bootstrapping a Software Product
garrettdimon
295
110k
Transcript
3周年に突⼊する AbemaTVの挑戦と苦悩 @Developers Summit -A- #devsumiA
⼭中 勇成 a.k.a みゆっき • 4݄ גࣜձࣾαΠόʔΤʔδΣϯτೖࣾ גࣜձࣾAbemaTV ίϯςϯπ৴νʔϜ Streaming
Reliability Engineer toriimiyukki miyukki
AbemaTVとは 24時間365⽇のリニア型放送を⾏う、インターネットテレビ局 ニュース番組やアニメをはじめとした多彩な番組が楽しめる約20チャンネルを提供 PC、タブレット、スマホ、テレビデバイスなど様々なデバイスで楽しめます
無 料 会員登録なし 24時間編成
ຊ ֨ త ͳ ։ ൃ ։ ࢝
Ծ ։ ہ ُ ా ڵ ؽ ʹ উ ͬ ͨ Β ສ ԁ ࢹ ௌ ऀ ͕ ࡴ ౸ ͠ ࣌ ؒ μ ϯ ։ ہ प Ϗ σ Φ ػ ೳ ɾ ॎ ը ໘ Ϧ Ϧ ɹ ε ʔ ։ ہ प μ ϯ ϩ ɹ υ ɾ ͬ ͔ ͚ ࠶ ੜ Ϧ Ϧ ɹ ε ʔ ʔ ࢝ ಛ ൪ ແ ࣄ ࢝ Λ Γ Δ ࢝ ಛ ൪ ϐ ɹ Ϋ ଳ ͷ $ . ࣌ ʹ ࢹ ௌ ো ʔ ຊ ։ ہ ཌ ʹ ( $ 1 ͷ શ Ϧ ɹ δ ϣ ϯ ো ʔ ࣌ ؒ ϗ ϯ ω ς Ϩ Ϗ ແ ࣄ ৴ Λ ߦ ͍ ա ڈ ࠷ ߴ ࢹ ௌ Λ ه ʮ ʯ
今⽇の内容 • 今⽇話すこと AbemaTVが今までどう開発してきたか、なぜその技術を選んだか(挑戦) 今困っていることは何か、今だったらどうするのか(課題)を技術レイヤーごとに紹介 映像配信サービスに限らない⼀般的なWebサービス開発にも関わる話 • 今⽇話さないこと 映像配信に関するアーキテクチャ 番組表などサービス特有のアーキテクチャ
技術レイヤー チーム体制 アプリケーション ネットワーク 開発⽀援 モニタリング プロジェクト プロジェクト管理 ⾔語 構成管理
通信プロトコル CDN 広告 CI/CD テスト デプロイ 監視 ログ メトリクス ミドルウェア プラットフォーム 仮想化 勤務体制
最近の登壇 • 今⽇の話はAbemaTV Developer Conference から⼀部抜粋 https://speakerdeck.com/miyukki/the-history-of-abematvs-architecture https://logmi.jp/tech/articles/
プロジェクト
チーム⼈数 開発当初 2019年1⽉ 超
開発チーム体制 Web Android 新デバイス iOS 基盤開発 プロダクト開発 コンテンツエンジニアリング コンテンツ配信 SRE
データマネジメント Streaming Client デザイナー ディレクター QA
Android iOS Web New Device Streaming Client Developer Infrastructure Product
Content Engineering Content Delivery Data Management SRE Direction Design QA CTO VPoE BOARD
プロジェクト管理 • チームごとにプロジェクト管理はやりやすい⽅法を選択 JIRA、GitHub Projects、物理ボードなどさまざま • サーバのリリースは不定 • クライアントは2週間のスプリントで開発とリリースを 回している
機能リリースの仕様やQAなどのスケジュールをディレクターが管理
勤務体制 • 週に1度のリモート勤務が推奨 • AbemaTVはCA社内でも年齢層が⾼く(シニアエンジニアが多い)、 家庭事情でスライド勤務などが許可されていたり柔軟な対応をしている
アプリケーション
開発着⼿前 • 当時としては、挑戦的な構成で挑むことを検討していた 当時のCTO
プラットフォーム • オンプレはコスト以外のメリットがなく却下 • 既に知⾒のあるAWSかGCPの選択肢へ
なぜGCPを選んだか ⾼機能L ロードバランサ Stackdriver Logging / BigQueryなどの ログ収集や集計サービスの充実 ネットワーク帯域に対するコストの安さ GKE
/ Kubernetes
GCPの課題 • 開発当初に東京リージョンはなかったが、台湾リージョンを使⽤しているこ とでいくつかの課題が浮上 ⽇本と台湾間のネットワーク 遅延と安定性が国内のリージョンに⽐べて劣る 東京リージョンや国内の別のプラットフォームに移動したい Legacy Network(VPC) 開発当初はLegacy
Networkしかなかったため、Legacy Networkを使⽤しているが、 Lagacy Network上ではリージョン間でサブネットを作成することができないなど、 リージョン移⾏ やネットワーク移⾏を⾏う負担が⼤きい
⾔語 • CyberAgentのバックエンドにおける開発⾔語は、Java→Node.js→Go Ameba OwndやAWAなどがGoを使⽤し、当時のCTOがAWAから来たこともあり、Goを採⽤
アーキテクチャ • Microservicesアーキテクチャを採⽤ 機能単位でのリリースやスケールが可能 コンテナ化によるリソースの有効活⽤が可能 AbemaTVには、約80のサービスがある • 各サービス間の通信は gRPC+Protocol Buffers
• Gateway系/Backend系に分けたGateway Pattern (BUFXBZ 4FSWJDF #BDLFOE 4FSWJDF %BUBCBTF
Go/Microservicesの課題 • パッケージ管理 開発当初はGodepを使⽤してvendor管理をしていた 新しい⼀部のサービスからはdepを使い始めている • Goのバージョン管理 Goは約半年にメジャーバージョンリリースされ、最新2つしかサポートしない 基本的にビルドするGoバージョンを上げれば済むが、サービス古いバージョンを使⽤してい たり…ということもある
Go/Microservicesの課題 • 共通ロジックをどこにまとめるか AbemaTVの開発当初はMonorepoで1つのリポジトリに複数サービスのコードが存在した その後、サービスごとにリポジトリを分解してからは、共通ロジックをまとめるリポジトリを 作成して、そこを集約 → 最新の共通ロジックに追従しているサービスとそうでないサービスがバラバラになる 全てのサーバの共通したロジックをどこに置き、どう⼀⻫に管理するかが課題 •
役割の負担が⼤きいマイクロサービス 開発を続けていると1つのサービスの責務が⼤きくなってくるので、良きタイミングで分解する
仮想化/コンテナ • GKE / Kubernetes GCPを使った最⼤のアドバンテージ Googleの豊富な経験に基づいて構築された、マネジメントなKubenetes Engine環境
データベース • MongoDB 開発当初はGCPで提供している、Cloud BigtableかCloud Datastoreにしたかった 先⾏して編成ツールを完成する必要があり、クエリ要件やスキーマの柔軟な変更が求められ る開発状況の為、MongoDBを採⽤ MongoDB Cloud
Managerを使⽤して管理 各種メトリクスの表⽰、スナップショットの管理など シャーディングによる分散とレプリカセットによる冗⻑化構成 vCPU core、RAM GBのmongodインスタンスが約60台稼働 ドメインに応じてクラスタを⽤意 過去にデータベースのコネクションが枯渇してサービス影響が出たことがあったため 負荷分散と障害影響の最⼩化を⽬的として、ユーザー⽤、コメント⽤、配信⽤とクラスタを分散
MongoDBの課題 • Mongosの管理、コネクションプールの管理 • スキーマは柔軟だが複雑なビジネス要件をそのまま処理すると即死する • イケてるGoのライブラリが無い
キャッシュ • In-Memory Goのアプリケーション側でのキャッシュ 使⽤頻度が⾼く、すべてのインスタンスが持っているべきデータであれば、In-Memoryで キャッシュする事が多い
キャッシュ • Redis 開発当初はGCPでマネージドなキャッシュサービスが提供していなかった → 現在はCloud Memorystore for Redisがリリースされている 主にセッション管理、ロック⽬的、ネットワーク的な負荷を減らす⽬的で使⽤される
ネットワーク的な負荷…GCSへのファイルへのキャッシュ MongoDBと同様、ドメインに応じてRedis Clusterを構築
構成管理 • Terraform クラウド環境上のインフラ構築や設定を、コードを使って⾃動化するためのツール AbemaTVでは、GCPの構成管理に使⽤ DNS、GCEインスタンス、ディスクなど… • Packer 複数の仮想化環境、クラウド環境に対応した マシンイメージを作成、起動するためのツール
AbemaTVでは、GCEインスタンスのディスクイメージを作成するために使⽤ Redis、MongoDB、Varnish、Wowzaなど…
ネットワーク
クライアント間通信 • gRPCも検討したが… 開発当初は、GCLB(Google Cloud Load Balancing)がHTTPの負荷分散ではHTTP/ . や gRPCでのバックエンドとの通信に対応していなかった
→ 現在はgRPCでのバックエンドとの通信をサポート • クライアントとの通信フォーマットとしてProtocol Buffersを使⽤
CDN • Akamai Media Deliveryを使⽤ 開発当初に、HLSなどのメディアデリバリーに特化した製品が少なく、 サービスの規模を鑑みてAkamaiを採⽤ • APIのCDNとしてはCloud CDNを使⽤
GCLBの設定にチェックを加えるだけで設定完了する容易さから採⽤
広告 • リニア型配信ではSSAI(Server-Side Ad Insertion)で広告を挿⼊ 開発当初では、社内で開発している広告サーバと独⾃⽅式で通信をしていたが、 汎⽤的な規格であるVASTに統⼀ • VOD型配信ではCSAI(Client-Side Ad
Insertion)で広告を挿⼊ サーバで挿⼊するとシーク制御が難しいため、クライアント側で挿⼊ Google IMA(Interactive Media Ads)のSDKをクライアントに⼊れて、VASTで通信を⾏う
開発⽀援
CI/CD • Codeship バックエンドのテストやイメージの作成を⾏うCI(継続的インテグレーション)サービス Dockerコンテナを並列に可動させてパイプラインを組むことが可能 • Deploykun 社内製のCD(継続的デリバリ)を⾏うためのChatOps⽤のボット
Deploykun • ChatOpsでサービスのバージョン作成、デプロイ、ロールバック、スケール をサポート
リリース時のフロー Apply Deploykun Developer GitHub Codeship Create release Create tag
Hook Run test Return result GKE Push image Create ops PR Merge ops PR Deploy バージョン 作成 リリース
モニタリング
監視 • サービスのスパイク‧エラー監視はBugsnagを使⽤ ライブラリをインポートして、呼び出すとエラーを集計 リリース後の新規エラーやスパイクなどを検知することが可能 • Google Cloud MonitoringにてGCE/GKEの挙動を監視 •
これらの異常を検知すると、Slackに投稿&バックエンドエンジニアにコール ⾃分の担当以外のサービスのコールが掛かってくる エンジニア以外が対応ステータスがわかりにくい PagerDutyを使ったオンコール体制の⾒直し 課題
PagerDutyを使ったオンコール体制の⾒直し • PagerDuty インシデント管理ソリューション 監視元の連携が豊富であり、スケジューリング‧エスカレーションなどの設定が可能 SREチームで1次対応 アラートに対するマニュアルが作成されていてれば、その対処を実施 マニュアルがない場合は、可能な対応と2次対応者を呼び出し、その後マニュアルを作成 インシデントのNoteに書き込むことにより、インシデントの状況を記録&展開 画像が貼れないのがネック…
ログ • アプリケーションログ Goの標準出⼒にJSON形式で出⼒ → GKEのfluentdがログを収集、StackDriver Loggingで表⽰ • アクセスログ 開発当初はfluentdを使って収集していたが、Goでの扱いづらさとfluentdの運⽤が必要
だったため、Cloud PubSubとBigQueryを使った形に置き換え Cloud PubSub BigQuery App Stream Inserter
アクセスログの課題 Streaming Inserterの運⽤と管理 BigQueryのStreaming Insertのキャパシティ サービスごとのカスタムカラムの追加がし難い 常にBigQueryにデータを⼊れ続けるコスト • 新ログシステムに求める要件 フルマネージド
柔軟なスキーマ Cloud DataflowとApache Avroを使⽤したログシステムへ 課題
Cloud Dataflowを使⽤したログシステム • Apache Avroを利⽤するメリット BigQueryがGCSからのAvroファイルの取り込みをサポート スキーマがファイルに含まれているので、展開時に管理する必要がない Cloud Dataflow Cloud
Storage Cloud PubSub BigQuery Cloud Storage App Cloud DataflowでPubSubからのデータを⼀定の間隔(数⼗秒)ごとに区切られたAvroをGCSへ保存 ログが必要なときに、GCSからAvroファイルをインポート app- .avro
メトリクス • Redis / MongoDBなどのインスタンスメトリクスはStackdriverで視覚化 • 各アプリケーションメトリクスはPrometheusで収集‧集計、 Grafanaで視覚化 Prometheusは負荷分散のために、ドメインごとに作成 複数のPrometheusのデプロイを簡略化するためHelmで管理
• 各サービスはメトリクス⽤のポートが開いており、Goの基本的なメトリクス (ヒープやGorutine数など)とサービス固有のメトリクスを出⼒
Prometheus + Grafana QSPNFUIFVTHSQD (SBGBOB QSPNFUIFVT NPOHPEC QSPNFUIFVTIUUQ QSPNFUIFVTLT QSPNFUIFVTSFEJT
QSPNFUIFVTOPEF HDF QSPNFUIFVTOPEF LT QSPNFUIFVTOPEF NJTD 4FSWJDF .POJUPS QSPNFUIFVTTFSWFST 1SPNFUIFVT 0QFSBUPS FYQPSUFST BMFSUNBOBHFS 4MBDL RVFSZ FYFD NBOBHF pOE UBSHFUT QVMM NFUSJDT QVTI BMFSUT OPUJGZ
今後の展望
なぜ挑戦と苦悩を続けるのか サービス規模の拡⼤ サービスが成⻑するに従い、ユーザーの増加や新たな機能追加などによるキャパシティの確保 マネジメントコストの抑制 さらなる安定化の追求 サービスの品質向上のため、より安定したアーキテクチャへの移⾏ 既存システムの⽼朽化 ミドルウェアなどのEOLや古いアーキテクチャによる開発‧保守コストの抑制
⽬指すべきアーキテクチャ 配信レイヤーの全⼆重化 チャンネル別リソース 実績と予測に基づいたオートスケール
配信レイヤーの全⼆重化 • 映像配信関わる全てのレイヤー(サーバや回線など)をユーザーの直前まで ⼆重化する Encoder Transcoder Proxy CDN Encoder Transcoder
Proxy CDN Encoder 現在 理想 User User Encoder Transcoder Proxy CDN
チャンネル別リソース • コンポーネントのリソースをチャンネル別に確保することにより、 リソースの効率化(容易なスケール)と障害時の影響の最⼩化を図る 現在 理想 Channel A Channel B
Channel A Channel B 1つのコンポーネントの障害により 全チャンネル障害となる 障害は1つのチャンネルに限られる
実績と予測に基づいたオートスケール • 現時点だとCPU使⽤率に応じたオートスケールをすることしかできないが、 視聴数などの過去の実績や時間帯の予測などに基づいたオートスケールをし て、コストとオペレーションを削減する
ご清聴ありがとうございました