はじめに
こんにちは!早稲田大学 創造理工学部 総合機械工学科 3 年の野村恒晴です。
11 月の約 1 ヶ月間、サイバーエージェントで「CA Tech JOB」という就業型インターンシップに参加させていただきました。
今回、私は ABEMA のバックエンドエンジニアとしてお仕事をさせていただきました。
本記事では私がインターン中に取り組んだ ABEMA の広告配信システムの負荷試験環境構築と、そこから得た学びについて紹介させていただきます。
背景
ABEMA の広告配信システムについて
ABEMA のコンテンツ内に挿入する広告の配信やトラッキング、分析など多くの機能を担当するシステムです。
現在の課題
「今日好き」などの人気番組の放映時には、視聴ユーザーが急増し、それに伴って配信される広告も増加するため、広告配信システムへのリクエストが大幅に増加します。
現在の ABEMA では、こうしたトラフィックの急増が予想される人気番組の放映前に、広告配信システムを一時的にスケールアウトする対応を行っています。
しかし、この手動でのスケールアウト作業は運用上のコストが大きいという課題がありました。
加えて現在の ABEMA では、最近の視聴数増加に備えて最大同時接続数の向上をチーム内目標としています。将来的に大量のユーザからの同時接続に恒常的に耐えられるシステムを構築するためには、現在の本番環境がどの程度のトラフィックまで処理可能なのかを把握しておく必要があります。
そこで負荷試験の実施が決定しましたが、今回の負荷試験は本番環境では実施することが難しいものでした。
そのため、負荷試験専用の環境を新たに整備することになりました。
取り組んだタスクについて
こうした背景から、私が取り組むことになったのが「ABEMA の広告配信システムの負荷試験環境構築」です。
具体的には、本番環境と同等の構成を持つ検証環境の構築を行います。
ABEMA の広告配信システムはマイクロサービスアーキテクチャを採用し、Go 言語で実装されています。
GKE 上の Kubernetes クラスタで動作しており、Redis などの Google Cloud リソースは Terraform で定義されてデプロイされています。
このプロジェクトにおける 1 ヶ月での流れは、以下の 3 点です:
- ABEMA の広告配信システムの各コンポーネントと Redis を負荷試験環境にデプロイする
- 負荷試験のための調整を各コンポーネントで行い、デプロイする
- 各コンポーネントが連携し、広告配信が問題なく動作することを確認する
タスクの流れ
- ABEMA の広告配信システムの各コンポーネントと Redis を負荷試験環境にデプロイする
既に負荷試験環境用のクラスタが GKE 上に作成されていたので、まずはこちらに Kubernetes node を追加しました。
本番環境で使われている ABEMA の広告配信システムの各コンポーネントの Docker image を指定して、負荷試験環境のクラスタにデプロイしていきました。本番環境と同じ image を使用することで、実際の運用状況により近い条件での負荷試験を実現できるようにしました。
また、負荷試験用の Redis のリソースを新たに Terraform で定義して、Google Cloud 上にデプロイしました。Redis は広告配信における重要なキャッシュ層として機能するため、本番環境と同等のスペックで構築し、適切なパフォーマンス測定ができる環境を整えました。
2. 負荷試験のための調整を各コンポーネントで行い、デプロイする
手順 1 でデプロイした Kubernetes リソースが起こしたエラーを 1 つずつ丁寧に潰していきました。
環境変数の設定ミスやネットワーク設定の不備、リソース制限の調整など、様々な問題に対処しました。
また、ABEMA の広告配信システムの各コンポーネントは様々な依存関係を持っていて、中には負荷試験と関係のないものも含まれます。
例えば、本番環境では使用している外部 API や分析ツールとの連携などです。
したがって、それらを適切にモックしたり、無効化する修正も行いました。
さらに、負荷試験では試験用に準備した広告データを用いるなど、本番環境とは微妙に動作の違う部分が含まれます。
その部分についても各コンポーネントで実装を行いました。
3. 各コンポーネントが連携し、広告配信が問題なく動作することを確認する
動作確認を行い、必要な広告のデータが配信できることを確認しました。
難しかったポイント
同等性とモックのバランス
負荷試験環境には、試験の妥当性を担保するため、本番環境と同等の構成が求められます。
しかし、完全に本番環境と同じ構成にすると、負荷試験に関係のない API に対しても大量のリクエストが発生してしまいます。
これらの API では負荷試験の実施を認識していない場合もあるため、予期しない障害や他サービスへの影響が生じる可能性がありました。
そのため、負荷試験の要件を理解した上で、試験結果に影響を与えない範囲で適切にモックする必要がありました。
一方で、過度なモックは試験の妥当性を損なうため、この境界線の設計が難しいポイントでした。
妥当性を担保しつつ適切にモックするために、モックして良い範囲とそうではない範囲を慎重に判断し、こまめにメンターに確認を取りながら進めました。
ドメイン知識の理解
上述した同等性とモックのバランスを取るためには、モックして良い範囲とそうでない範囲を適切に判断する必要があります。
そのためには、広告配信の仕組みや規格を理解し、各コンポーネントの役割を把握した上で、ソースコード内の処理内容を理解することが求められました。
広告配信のドメイン知識は膨大でしたが、コンポーネントの役割やつまずきやすい仕様については、メンターが詳しく解説してくださり大変助かりました。
また、ソースコードも非常に大規模だったため、負荷試験に関連する箇所とそうでない箇所を適切に見分けながら、効率的に読み進めていきました。
インターンでの学び
技術面
今回のインターンでは、多くの新しい技術に触れ、実践的なスキルを身につけることができました。
まず、Golang については実務で使用するのが初めてでした。
特に gRPC を用いたマイクロサービス間の連携を実装する経験は貴重で、分散システムにおける通信の仕組みを深く理解することができました。
Terraform も今回初めて触れた技術です。
インフラのコード化 (IaC) の概念を実践を通じて学び、インフラ管理の効率性や再現性の重要性を実感しました。
Kubernetes については以前実務で触れたことがありましたが、今回のインターンでさらに理解が深まりました。
特に、ログの解析やトラブルシューティングのスキルが向上し、問題解決能力が上達したと感じています。
また、会議や日々の業務の中で、ABEMA のような大規模トラフィックを扱うプロダクトならではの高可用性設計の重要性を学びました。
システムの信頼性を保つための設計思想や運用の考え方は、今後のキャリアにおいても大きな財産になると思います。
ドメイン面
1 ヶ月を通して、広告ビジネスの基礎を深く理解することができました。
インターンシップを始めるまで、広告に「在庫」という概念があることすら知りませんでした。
広告枠には限りがあり、それをどう効率的に販売・配信するかがビジネスの重要な要素になっていることを学びました。
特に興味深かったのは、この在庫を増やすために、各企業が新たな広告フォーマットを次々と考案している点です。
ユーザー体験を損なわずに、いかに広告価値を最大化するかという挑戦は、技術とビジネスの両面から非常に魅力的だと感じました。
また、システムに触れる中で、動画広告の配信規格である VMAP や VAST についても初めて知りました。
これらの規格がどのように広告配信を標準化し、異なるプラットフォーム間での相互運用を可能にしているのかを理解できたことは、大きな収穫でした。
技術的な実装だけでなく、業界標準の仕組みを学べたことで、広告配信システム全体の見通しが良くなったと感じています。
まとめ
今回のインターンシップでは、ABEMA の広告配信システムの負荷試験環境構築に取り組みました。
本番環境と同等の構成を保ちながら、他サービスへの影響を抑えるために適切にモックする、というバランスの取れた設計が求められる挑戦的なプロジェクトでした。
広告配信のドメイン知識や ABEMA の広告配信システムのアーキテクチャを理解しながら、Golang、gRPC、Terraform、Kubernetes といった技術スタックを実践的に活用することで、大規模システムの開発・運用における考え方を学ぶことができました。
技術面では、マイクロサービス間の連携やインフラのコード化、高可用性設計の重要性を体感しました。
ドメイン面では、広告ビジネスの仕組みや在庫の概念、VMAP/VAST といった業界標準規格について理解を深めることができました。
1 ヶ月という限られた期間でしたが、実務レベルの開発経験を通じて、技術力だけでなくビジネス視点も含めた総合的な成長を実感できた、非常に価値のある経験となりました。
おわりに
今回のインターンを通じて、大規模プロダクトの開発現場で求められる技術力や思考法を実践的に学ぶことができました。
特に、システムの信頼性を保ちながら効率的に開発を進めるための設計思想や、ドメイン知識を深めることの重要性を身をもって体験できたことは、今後のエンジニアとしてのキャリアにおいて大きな財産になると確信しています。
また、サイバーエージェントの社風を肌で感じられたことも大きな収穫でした。
コミュニケーションが非常に活発で、役職や部署の垣根を越えて社員同士の繋がりが強い会社だと実感しました。
開発業務はもちろん充実していましたが、社員の方々とのランチや懇親会を通じて、エンジニアとしてのキャリアの考え方や社会人としての働き方など、多くの貴重なお話を伺うことができ、大変学びになりました。
メンターの方をはじめ、ABEMA の広告配信システム開発チームの皆さま、人事の皆さまには大変お世話になりました。
技術的なサポートはもちろん、ドメイン知識やキャリアについての考え方まで、幅広い学びを得ることができ、非常に充実した 1 ヶ月間となりました。
この経験を糧に、今後もより強いエンジニアになるために精進していきたいと思います。本当にありがとうございました。
