web-dev-qa-db-ja.com

Google AppEngineでのデータストアとクラウドSQL

多くの人(200万人以上)にサービスを提供するアプリケーションを構築したいので、 Google Cloud Datastore を使用する必要があると思います。ただし、 Google Cloud SQL を使用し、 mySQL を使用して多くの人々にサービスを提供するオプションがあることも知っています(FacebookやYoutubeのように)。

これは、これほど多くのユーザーがいるリレーショナルクラウドSQLではなく、データストアを使用するという正しい仮定ですか?前もって感謝します

17
user3376321

FacebookとYouTubeがMySQLを使用して、コンテンツの大部分をユーザーの大多数に提供しているというのは厳密には真実ではありません。どちらも主にスケーラビリティのために非常に大きなNoSQLストア(CassandraとBigTable)を使用し、おそらくより複雑なリレーショナルストレージを必要とする小規模な作業にはMySQLを使用します。可能であればデータストアを使用してみてください。無料で開始でき、大量のデータを処理するときにもコストを節約できます。

19
Martin Berends

インテリジェントな答えを出すには、あなたのアプリについてもっと知る必要があります。しかし...私が見つけた最大の落とし穴の概要を説明します...

Google Datastoreは、事実上分散型の階層型データストアです。彼らが望んでいたスケーラビリティを得るためには、いくつかの妥協が必要でした。開発者として、これらは簡単に回避できるものから、回避するのが難しいもの、または回避できないものまであります。後者は、あなたが想像するよりもはるかに可能性が高いです。

リレーショナルデータベースと、同じトランザクション内の複数のテーブルにまたがるデータを操作する機能に慣れている場合は、データストアで髪を引っ張る可能性があります。最大の(?)落とし穴は、トランザクションがサポートされるのは限られた数のエンティティグループ(現時点では5)のみであるということです。簡単な例を挙げると、単純な親子関係があり、トランザクション内で同時に5人以上の親の下の子レコードを更新する必要があるとします...実行できません(はい、本当に)。データ構造を再編成し、以前のすべての子レコードを単一のエンティティの下に配置して、単一のトランザクションで更新できるようにしようとすると、別の制限が発生します...同じものを確実に更新できないという事実エンティティグループは1秒に2回以上(はい、本当に)。また、それぞれのルートエンティティを指定せずに親間でエンティティタイプをクエリすると、結果整合性と呼ばれるものが得られます...つまり、そうではありません(実際にはそうです)。

上記はすべてGoogleのドキュメントに記載されていますが、始めたばかりの場合は、それを理解する可能性があります(もちろん、それを処理できます!)。

31
Robert D

それは、「多くの人々」が何を意味するか、どのような種類のデータを持っているか、そしてそれをどうしたいかによって異なります。

Cloud SQLは、SQLデータベースを必要とするアプリケーション向けに設計されています。SQLデータベースは、SQLで記述できるすべてのクエリを処理でき、データが常に一貫した状態にあることを保証します。

Cloud SQLは、層に応じて、最大3200の同時クエリを処理できます。クエリが単純で、RAMから提供できる場合、数ミリ秒かかるはずです。ユーザーが1秒あたり約1つのリクエストを発行すると仮定すると、同時にアクティブな数万人のユーザーをサポートできます。 。ただし、検索などのより複雑なクエリを実行している場合や、大量のデータを書き込んでいる場合は、それは少なくなります。

単純なクエリのセットがある場合、即時の一貫性についてあまり関心がない場合、またははるかに多くのトラフィックが予想される場合は、データストアを確認する必要があります。

9
Joe Faith