Amazon Web Services ブログ

Waves における大規模なユーザークエリとレコメンデーションへの Amazon Neptune の利用

本記事は、ClearScale のソリューションアーキテクチャディレクタであり、APN のプレミアコンサルティングパートナーとしてもクラウドの全体的なプロフェッショナルサービスを提供している、Pavel Vasilyev 氏の寄稿です

Waves は Y Combinator から支援を受けているデートアプリです。同社の既存の IT アーキテクチャが、Google Cloud では維持しきれなくなると経営陣が認識したとき、それは AWS への移行を開始するタイミングとなりました。Waves は、Google Cloud から AWS への移行、およびグラフデータベースエンジン専用に設計された Amazon Neptune などのサービスを使った機能を実装するにあたり、 ClearScale とパートナーを結ぶことを決めました。Neptune を使用する開発者は、相互接続したデーセットを扱うアプリケーションの構築と実行が可能になります。これは、Waves が必要としていた機能そのものです

それまで Waves アプリケーションは、急速に増加するユーザー数に起因する、いくつもの課題と対峙していました。これらの課題には、特定のデータベースクエリが原因となった信頼性やレイテンシーの問題が含まれます。これらのクエリは、アプリに組み込まれたレコメンデーションエンジンが実行しているものです。加えて、Waves でのインフラストラクチャ向け予算は想定外の速さで増加し続けており、その終着点も見えない状態だったのです。

この記事では、Waves のワークロードを AWS に移行するために、ClearScale が取った手法をご紹介します。またそこで、膨大なクエリボリュームを処理できる先進的なレコメンデーションエンジンを構築するために、Neptune を導入した方法についてもご説明していきます。加えて、AWS が提供する他の機能を使用しながら、ClearScale が Waves の全体的なアーキテクチャを強化した方法も解説します。

移行プロジェクト

まず、Waves と ClearScale の両者は、この共同作業が、次のような 5 つのステージに分かれることを明確化しました。

  1. Cloud Storage から Amazon Simple Storage Service (Amazon S3) への、静的データの移行
  2. Cloud Firestore から Neptune への、ユーザープロファイルデータの移行
  3. 画像の変化をキャプチャするための、Neptune Streams の実装
  4. データベースクエリ送信のための、AWS AppSyncGraphQL の実装
  5. Amazon CognitoAmazon Pinpoint を使用した、エンドユーザーエクスペリエンスの最適化

既存ユーザーができるだけ障害を実感しないように、この移行過程には、細心の注意が必要とされました。また、最終段階では、Waves の開発者が新たな機能や改良を長期にわたり展開できるようにする必要がありました。

Amazon S3 への静的データの移行

Waves ではそれまで、ユーザーのプロファイル画像などの静的なデータを、Google Cloud Platform (GCP) Cloud Storage に保存していました。ClearScale は、このデータを、高いスケーラビリティと耐障害性を備えたオブジェクトストレージサービスである、Amazon S3 に移行しました。Amazon S3 では、さまざまなアクセスレベルや料金によりカテゴリ分けされた、多様なストレージクラスが利用できます。これにより、コスト効率を最大化することができます。

ClearScale のデータベースエキスパートは、この移行を実施するために、一時的な EMR と DistCp コマンドを使用しました。DistCp は、MapReduce を用いて、1 つのクラスターから別のクラスターへのデータコピーを行います。エキスパートチームでは、まず、データを EMR HDFS にダウンロードした後、Amazon S3 にアップロードしました。

GCP Cloud Storage へ接続するために、チームはクラスターへの SSH アクセスを定義し、/etc/hadoop/conf/core-site.xml 定義ファイルに必要なプロパティを追加しました。google.cloud.auth.service.account.json.keyfile プロパティの値は、Waves 側のチームから提供された json-key ファイルを指し示すためのものです。

Neptune へのユーザープロファイルデータの移行

元々 Waves では、ユーザープロファイルデータは、Google Cloud Firestore に保存していました。移行時点では、このデータのトータルのロードは比較的小さいものでした。したがって、ClearScale は Neptune へのすべての情報の移動を、分離した Amazon Elastic Compute Cloud (Amazon EC2) インスタンスと node-firestore-import-export (MIT ライセンス) ユーティリティを使用して実施することができました。

データは、まず JSON 形式でダウンロードされ、その後、カスタムの Node.js ユーティリティにより、Neptune 互換形式に変換します。移行での最終ステップでは、標準エンドポイントと Neptune バルクローダーエンドポイントに対し、POST リクエストを使用します。詳細については「Neptune ローダーコマンド」をご参照ください。

Neptune の役割

今回 ClearScale は、グラフデータベースサービスであれば数十億の相関関係を最小限のレイテンシーで保存およびクエリできるという理由から、Neptune の使用を選択しました。Waves を始めとするソーシャルネットワークやデートアプリでは、質の高いプロファイルマッチングをユーザーに提供するために、こういった機能が求められます。Neptune では、主要な画像モデルとクエリ言語がサポートされており、また、リードレプリカ、ポイントインタイムリカバリー、および継続的なバックアップなども利用可能です。また Neptune は、完全マネージド型のグラフデータベースサービスでもあります。つまり、開発チームは、ハードウェアのプロビジョニングや設定、そしてソフトウェアのパッチ修正など、大変なだけの管理業務から解放されるのです。

画像の変化をキャプチャするための、Neptune Streams の実装

Neptune には、データベース内の変更をログ記録するメカニズムである、Neptune Streams も備わっています。この機能は、すべての画像変更を追跡しながら、その原因となったトランザクションと同期して各エントリーをログ記録します。Neptune Streams を使用することで、Waves の開発者は、変更に応答するためのコードをアプリケーションに追加し、フロントエンドのユーザーエクスペリエンスを更新することができます。各ユーザーは、HTTP REST API により変更記録を取得することが可能です。

ClearScale は、Neptune Streams ログを分析し、各イベントを個別アクションに合わせ処理する、フィルタリングコンポーネントの開発も行いました。たとえば、あるユーザーの地理的位置が変化すると、この個人に紹介する推奨プロファイルの一覧に関する再計算処理がトリガーされます。通知メッセージを送信する際にも、同様な処理が実行されます。

AWS AppSync と GraphQL の実装

今回 ClearScale は、AWS AppSync の実装も行っています。これは、Waves のモバイルアプリがデータベースクエリを送信することを可能にします。このマネージド型サービスでは、いくつかのデータソース間におけるデータフローをオーケストレーションするために、GraphQL を使用しています。これは特に、Waves アプリにおけるユーザーの行動をアプリケーションのサーバーコンポーネントに送信および保存するための処理を、簡素化するのに役立ちます。

アプリケーションレベルでは、HTTP リクエストが AWS AppSync API に対し送信されます。これにより、定義済みの GraphQL スキーマと対応させながら、各リクエストが検証されます。AWS AppSync は、データソースとの間で対応したマップのやり取りをするための、リクエストとレスポンスのマッピングテンプレートを使用します。AWS AppSync の使用により ClearScale は、アプリケーションのロジックや、アーキテクチャとの分離レイヤーを追加する作業に集中できるようになりました。このレイヤーにより、開発プロセスが簡素化できます。

Amazon Cognito と Amazon Pinpoint を使用した、エンドユーザーエクスペリエンスの最適化

本プロジェクトにおける最後のコンポーネントには、フロントエンドのエクスペリエンスを強化するために、Amazon Cognito を Amazon Pinpoint を導入しています。Amazon Cognito により、Waves は、ユーザーの個人的なデバイスを通じての、新規ユーザープロファイルの認証ができるようになりました。Amazon Pinpoint は、アプリが専用のプッシュ通知を各ユーザーに直接送信できるようにします。

今回、ClearScale は既存のアプリケーションを移行していたので、まず始めに、その時点でのユーザーを移動させることが重要でした。既存のユーザープロファイルを、Amazon Cognito のユーザープールで事前作成することで、新旧の環境間での移動をシームレスに行えるようにしました。新規ユーザーの場合は、サインアップ段階で Amazon Cognito に登録されます。

Waves のチームは、アプリケーションに備わっていたプッシュ通知の維持も希望していました。この要件を満たすため、ClearScale では Amazon Pinpoint を導入しています。

まとめ

今回の記事では、Google Cloud から AWS へのモバイルアプリケーションの移行を、ClearScale がいかに実施したかについて解説しました。また、パフォーマンス、スケーラビリティ、そして耐障害性を最大化するための、さまざまなクラウドサービスの実装についてもご紹介しました。

この作業の中心にあるのが、グラフデータベースエンジン専用に設計された Neptune です。これは、レコメンデーションエンジン、不正検出、ナレッジグラフなどを扱うアプリケーションにおいて、特に威力を発揮します。Waves のデートアプリでは、Amazon Cognito、Amazon Pinpoint、および AWS AppSync と組合せて Neptune を利用しています。これにより、フロントエンドのユーザーエクスペリエンスを合理化しながら、将来の需要にも対応しています。

 


著者について

Pavel Vasilyev 氏、ソリューションアーキテクチャディレクター

Vasilyev 氏は、ClearScale 社におけるソリューションアーキテクチャ担当チームのリーダーです。Vasilyev 氏は、スケーラブルかつ高可用性で不正にも耐性のあるシステムの設計およびデプロイに関する、12 年以上の実践的な経験を持ちます。彼は、情報科学とコンピュータサイエンスの分野で、エンジニアリングとテクノロジーの修士号を取得しています。