2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
藤井力哉氏:それでは始めます。「ABEMA」バックエンドエンジニアの藤井力哉から「コメント機能におけるTwitter連携機能で動画がシェアされる際のGo製サーバー開発」というタイトルで発表いたします。
(スライドを示して)最初に自己紹介をさせてください。私は藤井力哉と言います。2020年京都産業大学を卒業後、株式会社サイバーエージェントへ新卒入社しました。入社後はABEMAへ配属されて、これまでバックエンドエンジニアとしてサービス開発に従事してきました。
(スライドを示して)今回のアジェンダです。まずは、ABEMAのコメント機能について簡単に説明をします。次に、今回Twitterに投稿する動画の切り出しはサーバーサイドで実現したのですが、その手法についてお伝えします。その後、今回のコメント機能を作る際にパフォーマンス向上のためのTipsとしてインメモリキャッシュとsync.Poolを利用したので、それらについてお話しします。
まずはABEMAで提供しているコメント機能の説明です。(スライドを示して)ABEMAでは、「コメントを見ながらコンテンツを視聴する体験」を提供しています。リアルタイムでのコメントの投稿や参照などが可能です。ABEMAは追っかけ再生という、放送中の番組を任意の時間から再生する機能を提供しているのですが、追っかけ再生中にもその任意の時間に投稿されたコメントを参照できます。
また、Twitter連携というものがあって、Twitterにコメントした内容をツイートすることもできます。ABEMAでは、動画のツイートを許可するかどうかをコンテンツの情報として設定できるのですが、それがONになっていた場合、その任意の時間の動画とともにコメントがツイートされます。
ツイートされる動画は、サーバー側で短く切り出しています。また、この投稿される動画は一応タイミングにも気をつけており、例えば試合でゴールが入った時などのネタバレを防ぐために、そのコメントの視聴位置に基づいて、コメント投稿時のシーンがツイートされた動画の最後のほうに来る設計になっています。
(スライドを示して)始めに、動画切り出しをどのように実現したかを、簡単なシーケンスを用いて説明します。今回は、一定の間隔で処理が実行されるWorkerというものを作成しました。
コンテンツデータが管理されているデータベースがあるのですが、実行後は、まずそこからコンテンツデータの一覧を取得しに行きます。
取得したコンテンツデータは、動画のシェアが許可されているコンテンツかどうかという設定を持っているので、動画シェアが許可されているコンテンツのみの抽出を行います。抽出したコンテンツの一覧に対しては、(スライドを示して)次のような処理が実行されます。
動画は配信サーバーで管理されているため、配信サーバーから動画のプレイリストを取得しに行きます。その後、動画切り出しをする範囲を決定して、動画のセグメントの取得やセグメントごとの動画作成を行います。このあたりの実装例は後ほどの資料で説明します。
動画の作成が完了したら、作成した動画を特定セグメント分結合させて、完成したらその動画のアップロードを動画データを管理しているデータベースにアップロードします。動画部分の結合部分に関してどのように実現したかも後ほど資料で説明します。
(スライドを示して)続いて、動画付きツイートに関して、簡単なシーケンスを用いて流れを説明します。
まずクライアントからサーバーにコメントの投稿のリクエストが来ます。その際にコメントデータを管理しているデータベースにコメントの内容が保存されます。その後ツイートする際に利用する動画データの取得をしに行きます。今回動画データは、インメモリキャッシュでキャッシュする戦略を取りました。
なので、まず動画データをインメモリキャッシュから取得しに行きます。キャッシュから取得できなかった場合は、動画データを管理しているデータベースから取得して、取得に成功した場合はインメモリキャッシュに保存します。こうすることで次回以降、動画データをインメモリキャッシュから取得することが可能になり、データベースの負荷を減らすことでパフォーマンスの向上が見込めます。
動画を取得できたらTwitterが公開しているAPIを利用して動画をアップロードします。ツイートもTwitterが公開しているAPIで行っているのですが、その前にTwitterへアップロードした動画と、ツイートするデータを紐づけるために動画のメタデータを付与しています。動画のメタデータの付与もTwitterが公開しているAPIで行っています。これらの処理が完了したら最後にツイートして処理が完了します。
動画のアップロードやメタデータの付与などはエラーになるケースも考えられるので、その際は動画データを付与せずにテキストだけでツイートするなど、ケアも行っています。
続いて、先ほどシーケンスで説明した動画切り出しの部分について、Goの実装でどのように実現したかをお話しします。(スライドを示して)今回の動画付きツイートの動画では、HLSを利用しました。HLSはHTTP Live Streamingの略です。動画ストリーミングプロトコルの1つで、Apple社が開発した規格です。
HLSのファイルは、細かく分割した動画コンテンツが格納されているセグメントファイルと、セグメントファイルの再生順や秒数などが定義されているインデックスファイルの2種類のファイルで構成されています。(スライドの)右側には、インデックスファイルの例を記載しています。インデックスファイルにはセグメントの期間情報、読み込むセグメントファイルの順番、セグメントファイルの動画の秒数など、さまざまなデータが定義されています。
次に、今回動画切り出しに使用したライブラリを紹介します。(スライドを示して)今回使用したライブラリは、このライブラリです。こちらのライブラリは、HLSで利用される.m3u8ファイルのパースや生成処理などが可能です。ただしHLSを再生する方法などはサポートされてはいません。今回のTwitter動画切り出しでは、配信サーバーから取得した動画データをセグメントごとに分割するためにこのライブラリを利用しました。
(スライドを示して)この実装は、セグメントファイルを指定してプレイリストを作成する実装です。NewMediaPlaylistという関数を呼び出す際に、sliceをmakeで初期化するのと同じように、事前にセグメントファイル分のキャパシティを用意します。その後NewMediaPlaylistで生成したプレイリストに任意の数のセグメントファイルをアペンドします。
このプログラムを実行すると、(スライドの)右側に表示してあるような結果が得られます。playlist.Encode().String()でm3u8であるインデックスファイルの形式を得られます。これが生成されたプレイリストの結果です。
(スライドを示して)また、今回はffmpegコマンドをGoの実装で実行するアプローチを取りました。ffmpegは、動画ファイルや音声ファイルの再生、変換など、さまざまな操作を行えるコマンドラインインターフェイスです。
今回のTwitter動画シェアの実装では、セグメントごとに区切られたプレイリストをffmpegを利用して連結させました。セグメントごとに区切られたプレイリストは、先ほどお見せした実装で作成したプレイリストです。次のスライドでGoでどのように実現したか、実装例を紹介します。
(スライドを示して)セグメントごとに区切られた動画をffmpegを利用して連結させたGoの実装例がこちらです。argsのところで-iオプションで指定された任意の数の入力ファイルから読み込み、MP4ファイルを作成しました。オプションで渡しているinput.txtはセグメントファイルのファイル名が記載されているものです。
実際の実装では、Goのプログラムでセグメントのファイル名をinput.txtに抽出し、テンプファイルとして書き込みを行って、その結果を利用しました。ffmpegコマンドの実行は、Goの標準パッケージであるexecパッケージを使って行いました。このような実装を行うことで特定のセグメントを連携させたMP4ファイルの動画生成が可能です。
(次回へつづく)
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05