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.9k
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
560
"新しい未来のテレビ"を目指すABEMA配信システムの再設計 / Re-architecture of ABEMA live ingest system
miyukki
0
1.9k
AbemaTVのアーキテクチャの変遷 / The history of AbemaTV's architecture
miyukki
3
1.1k
機材管理ツールをFirebaseで構築しようとした話 / Building equipment management software with Firebase
miyukki
7
3.8k
AbemaTVで働くエンジニアの裏側 / The engineer working at AbemaTV
miyukki
0
720
動画配信サービスとしてこの先生きのこるには / The way to continue as a video streaming service
miyukki
8
3.4k
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
12k
映像制作現場における高解像度映像IP伝送装置の提案と実装 / Proposal and Implementation of Delivery System for High Resolution Video at Video Production Site
miyukki
0
140
Other Decks in Technology
See All in Technology
CEXやDEXに依存しないブロックチェーン取引について考える
sbtechnight
0
310
Oktaの管理者権限を適切に移譲してみた
shimosyan
2
240
ついに来る!TypeScript5.0の新機能
uhyo
16
8.7k
2023年は何する宣言
shigeruoda
0
240
アムロは成長しているのか AIから分析する
miyakemito
1
330
re:Inventで発表があったIoT事例の紹介と考察
kizawa2020
0
110
OCI DevOps 概要 / OCI DevOps overview
oracle4engineer
PRO
0
470
Astroで始める爆速個人サイト開発
takanorip
12
8.3k
経営統合をきっかけに会社をエンジニアリングした話 / btconjp-2023
carta_engineering
0
100
IoT から見る AWS re:invent 2022 ― AWSのIoTの歴史を添えて/Point of view the AWS re:invent 2022 with IoT - with a history of IoT in AWS
ma2shita
0
150
2年で10→70人へ! スタートアップの 情報セキュリティ課題と施策
miekobayashi
1
200
plotlyで動くグラフを作る
kosshi
0
700
Featured
See All Featured
What's new in Ruby 2.0
geeforr
336
30k
Building Adaptive Systems
keathley
27
1.3k
In The Pink: A Labor of Love
frogandcode
132
21k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
Designing Experiences People Love
moore
130
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
254
12k
What’s in a name? Adding method to the madness
productmarketing
12
1.9k
Music & Morning Musume
bryan
36
4.6k
Testing 201, or: Great Expectations
jmmastey
25
5.7k
How to train your dragon (web standard)
notwaldorf
66
4.2k
Bootstrapping a Software Product
garrettdimon
299
110k
VelocityConf: Rendering Performance Case Studies
addyosmani
317
22k
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使⽤率に応じたオートスケールをすることしかできないが、 視聴数などの過去の実績や時間帯の予測などに基づいたオートスケールをし て、コストとオペレーションを削減する
ご清聴ありがとうございました