CAのProFit-Xに見るリアクティブシステム事例
Akkaで構築されたCA ProFit-X
ECサイトに代表されるように、短時間に膨大なトラフィックが集中するシステムを構築する際に高可用性を達成するために様々なイノベーションが実現されているが、その中でかなり有望とみなされているシステムが「リアクティブシステム」であると言っていいだろう。大量のリクエストを捌くためにロジックの並列化に加えて、非同期で動作すること、エラスティックで障害時にも耐えうるシステムとその特徴を表現しても良い。リアクティブシステムに関するより詳しい情報はThinkITでの連載記事を参照していただきたい。
今回、リアクティブシステムの代表的なフレームワークとして知られるAkkaを活用して実装されたインターネット広告のスマートフォン向けSSP(サプライサイドプラットフォーム)であるCA ProFit-Xの開発担当者にインタビューする機会を得た。CA ProFit-Xはサイバーエージェントのアドテク事業の一部としてインターネットを閲覧するスマートフォンに向けて広告を表示するSSPとして稼働しており、複数のDSP(デマンドサイドプラットフォーム)からの応札を高速に処理する必要がある。また単に高速に処理を行うだけではなく、障害時にもシステム全体に影響を及ぼさずに処理を続けるための耐障害性を持つことが特徴だ。
SSPやDSPなどのアドテクに関しては、サイバーエージェントが公開しているこの特集記事を参考にすると良いだろう。
今回、インタビューに応えてくれたのは、株式会社サイバーエージェントのアドテク本部アドテクスタジオ、CA ProFit-Xカンパニー プロダクトグループの松村郁生氏だ。
今回のシステムに関して、そもそもどういう経緯でSSPであるCA ProFit-Xに関わったのかを教えてください
2014年ぐらいに、これからはネイティブアドが立ち上がってくるということで、サイバーエージェントでもスマートフォン向けのSSPを作ろうということになりました。それまではAmoAdというチームにいたのですが、新たにチームが作られてそこでシステムについての検討が始まったという流れですね。その時は、エンジニアとビジネス側の人も入れて5名くらいのチームでした。
Akkaを使ってシステムを作ろうと決めたのはいつごろなのですか?
SSPということで色々なところからメッセージが飛んでくるのを処理しなければいけない、ということでかなり早い時期から決めていましたね。明確にこれで行くっていう決定があったわけではなくて、私がAkkaを調べて使っているうちに「もうこれでいく」ということになってしまったみたいな感じです(笑)。実際に多くのDSPにメッセージを投げて100ミリ秒以内に処理をしなければいけないという要件を満たすためには、AkkaとAkka-streamを上手く使えばできそうだという感じがしたのです。
車載センサーシミュレーションが発想の原点
実は新卒で入った前の会社で、車に搭載されているセンサーからのデータを処理するシミュレーションシステムを開発していた時に先輩から「並列化のコンテクストスイッチングをOSに任せていると間に合わないので、自分で管理して切り替えるようにする」ということを教わりまして、その経験がCA ProFit-Xに活かされたという背景があるのです。
それはつまり車に積んであるセンサーが送ってくる大量のデータを並列処理する際にロジックで切り替え、OSの機能を使わないということですよね?
そうです。ですからSSPとしてDSPから飛んでくるデータを高速に処理しなければならないProFit-Xも、それと同じ発想でシステムを作ろうと思いました。そういう意味では経験が活かされているわけですが、実際にSSPを作ってみると車載センサーのシミュレーションとは全く違う部分もありまして。
それはどんなところですか?
車載の場合、ネットワークが分断される、ネットワークにトラブルが起こるというのは基本考える必要はありません。ところがインターネットの場合は、ネットワークに異常が起こるのは当たり前という(笑)。その部分だけは、最初ちょっと戸惑いました。
実際にAkkaを使ってプロトタイプを作ったりはしたのですか?
背圧制御の部分に関しては、Akka Streamの上でプロトタイプとして作りましたね。これはDSPに見立ててメッセージを返すだけのアプリにメッセージを送って、返ってきたデータを処理する際に、マルチコアのCPUのコアをちゃんと平均的に使えているか? を検証したかったのです。一つのコアだけが大量の処理を受け持つのではなく、どのコアもキレイに負荷が分散されるかという部分の検証ですね。また、実際にAkkaの上にAkka Streamというエクステンションを載せて動かしても大丈夫か、ということもありました。
実際に何か苦労した部分はありましたか?
システムのモニタリングをする部分はこれまでのシステムとは違っていて、そこに苦労しましたね。Actor単位でどれだけメッセージが溜まっているのかといった部分を見ないといけないので、その部分にはKamonというJVMのモニタリングができるツールを使っています。それが初期の頃に、メモリーリークを起こすというバグに遭遇してしまいました。コミュニティが直してくれたので、なんとかなりましたけど。ProFit-XはAWSの上で動いていますが、Akkaそのものは大きなバグもなくて安定して動いていますね。
Akkaの意義は無駄にスレッドを作らないこと
実際にAkkaの上ではどのくらいのスレッドが動いているのですか?
Akkaの上では、数個から10個に行くか行かないかくらいのスレッドの数だと思います。Akkaを使う意味はまさにその点、つまり「無駄にスレッドを作らない」ことだと考えています。そうすれば、OSがスレッドを切り替えたりしないでいてくれるというわけです。あと開発している側としては、レジリエンス性というか耐障害性については恩恵を受けていると感じますね。Actorが親子関係を持っているので、何か稀に起こるようなエラーでActorが死んでも親のActorが再起動してくれて何事もなかったような感じでシステムが動き続けるわけです。このような処理をアプリケーション側で対応する必要があるのとないのでは、違いは大きいです。そういう観点では、CA ProFit-Xはリアクティブなシステムと言えると思います。
今後の予定は?
実はAkka StreamのExperimentalなバージョンを本番環境で使っているので、現在の最新バージョンとはAPIが変わっています。今のところ、サーバーもちゃんと動いているし、クリティカルな問題も起こらずに安定していますけど、いつかは最新バージョンに入れ替えたいとは思っていますね。あとサイバーエージェントのアドテクスタジオの他の製品でも、Akkaを使えるところもあると思いますので、もっと社内に広めていきたいです。
Akkaを使ったリアクティブシステムの事例として、高速にメッセージをやり取りするSSPは最適なユースケースの一つと言えるだろう。単に並列化するだけではなく、ソフトウェアのエンジニアがマルチコアのCPUを使い切ること、OSのコンテクストスイッチを信用せずに高速化を図ることなど、現代のアプリケーション開発者がカバーしなければいけない要点がこれまで以上に拡がっていることに驚くとともに、それを可能にするオープンソースソフトウェアが拡がっていることを実感したインタビューであった。耐障害性を担保できるリアクティブシステムは、今後も追いかけていく予定だ。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- リアクティブシステムを実現するツールキットAkka その2
- 社内のエンジニアの知見を共有する新しい試みをサイバーエージェントに聞く
- Lightbend Reactive Platformによるリアクティブシステムの構築
- AI最前線の現場から【サイバーエージェント】アドテクスタジオ「AI Lab」の取り組み
- AI最前線の現場から【サイバーエージェント】アドテク分野におけるAI技術の活用事例
- Akka Clusterで超レジリエンスを手に入れる
- OpenStackのエコシステムを拡げるUpstream Trainingとは? CAのインフラエンジニアに訊いた
- リアクティブシステムが注目を集める理由
- OpenStack事例で知る現実解と多様な応用例
- Akka Streamsで実装するリアクティブストリーム