Slide 1

Slide 1 text

cookpadTVのライブ配信の裏側 Cookpad Tech Kitchen #15 2018/03/28

Slide 2

Slide 2 text

● 長田 卓哉 おさだたくや ● https://github.com/osadake212 ● 2015年10月クックパッド入社 ● 広告事業と動画事業の開発・運用を担当 ● エンジニア歴 ○ 2013〜 Android ○ 2015〜 Web (Ruby, Go) 自己紹介

Slide 3

Slide 3 text

アジェンダ ● cookpadTV ● サービス構成 ○ 全体 ○ AWS Elemental MediaLive / AWS Elemental MediaStore ○ メッセージサーバー

Slide 4

Slide 4 text

cookpadTV

Slide 5

Slide 5 text

cookpadTV ● 料理家や有名人と一緒に料理ができる ● 分かりづらいポイントをその場で質問で き、双方向コミュニケーションができる ○ コメントで質問 ○ ハートで盛り上げ ● その場でレシピを確認でき、料理の工程 が分かりやすい クッキングLIVEアプリ

Slide 6

Slide 6 text

サービス構成

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

LIVE配信 コメント/ハートAPI

Slide 9

Slide 9 text

LIVE配信

Slide 10

Slide 10 text

AWS Elemental MediaLive / AWS Elemental MediaStore • MediaLiveがRTMPで映像を受け取ってHLS形式に出力 • Security Groupを設定できる • LIVEデータはMediaStoreへ ArchiveデータはS3へ出力

Slide 11

Slide 11 text

AWS Elemental MediaLive / AWS Elemental MediaStore Security GroupはInput作成時に固定され、後から編集することができない ● Input作成時に撮影場所が決まっていない ● 場所が決まっても撮影当日までIPアドレスが分からない Problem Why?

Slide 12

Slide 12 text

AWS Elemental MediaLive / AWS Elemental MediaStore • Inputの前段にhaproxyを配置し、そのSecurity Groupを動的に設定できるように した • InputごとにIPアドレスが変わるので、管理画面でボタンを押すと
 設定をいい感じにできるようにした

Slide 13

Slide 13 text

AWS Elemental MediaLive / AWS Elemental MediaStore Security GroupはInput作成時に固定され、後から編集することができない ● Input作成時に撮影場所が決まっていない ● 場所が決まっても撮影当日までIPアドレスが分からない Problem Why?

Slide 14

Slide 14 text

AWS Elemental MediaLive / AWS Elemental MediaStore Security GroupはInput作成時に固定され、後から編集することができない ● Input作成時に撮影場所が決まっていない ● 場所が決まっても撮影当日までIPアドレスが分からない Problem Why? 2018/03/21 から編集できるようになりました!

Slide 15

Slide 15 text

コメント/ハートAPI

Slide 16

Slide 16 text

メッセージサーバー ● 他のAPIとは特性が違い、LIVE中にガッとくる ○ 同時接続が多い ○ 流量も多い ● アプリからポストされたコメント/ハートを
 接続されている他のアプリに届ける必要がある LIVE中のコメント/ハートを捌くAPIサーバー

Slide 17

Slide 17 text

メッセージサーバー ● ECS ServiceのAuto Scalingを設定しピークを乗り切れるようにする ● 同時接続が増えてもパフォーマンスを出せるようにするためGoで実装 ● レスポンスを速く返すためにDBアクセスがボトルネックにならないよう に、そもそもDBを使わない ○ 認証は寿命の短いトークンをAPI側で発行し、キャッシュに乗せる ○ データの永続化は非同期で行う

Slide 18

Slide 18 text

メッセージサーバー ● Firebase Realtime Databaseで双方向通信を実現 ○ iOS/Android SDKがあるので便利 ○ アプリは特定のノードを
 購読して更新を受け取る ● コメント/ハートのポストは
 一度メッセージサーバーが受ける ○ 認証・データの永続化をする

Slide 19

Slide 19 text

メッセージサーバー 転送量:多 転送量:少 ● データ転送量を抑えるために、同じノード を更新し続ける ● クライアント側で過去のコメントを保持

Slide 20

Slide 20 text

まとめ ● MediaLive / MediaStore を使ってLive配信 ○ haproxyを駆使してSecurity Groupの課題を解決 ● コメント/ハートを捌くためのメッセージサーバー ○ 要件に合わせてアプリケーションを分割 ○ DB使わない ○ Firebase Realtime Databaseをイベント通知に使う