0

多くの場合と同様、私はNoSQLの世界では新しくはありません。私はたくさんの研究をしましたが、まだ答えが1つしかないので、適切な答えが見つけられません。システムのGoogle Cloud DataStoreデータの提供方法

短い説明:

私は別のウェブサイトに訪問者のデータを収集するシステムを構築しています。各訪問は、デバイスタイプ、IP、訪問時間などのプロパティを持つデータストア内のエンティティです。

データストアには数百万回の訪問があります。

私の質問は、このデータをクライアントに提供する方法です。私のデータは、データストア内で「訪問」エンティティとして設定されています。

お客様がログインすると、何百万というレコードを表示したくありません。たとえば、一般的な統計情報を表示したいと思います。モバイルデバイスでの訪問数、特定の時間帯の特定の国からの訪問数、そのようなものなどです。

私はNoSQLデータベースが初めてのので、クライアントのダッシュボードにこれらの統計情報を表示する方法についてはわかりません。

私が知っているように、Datastoreでは、集計やクエリ結果の集計などがサポートされていません。

BigQueryを見ましたが、BigQueryはDatastoreの「バックアップ」で動作します。手動でバックアップする必要はなく、リアルタイムでデータを処理する必要があります。

また、カウンターとシャーディングカウンターについては、これが正しいアプローチですか?各追跡グループのプロパティごとにクライアントごとにカウンタがありますか?このように総数を表示しますか?簡単な目的のためにあまりにも多くのように聞こえる。

私は正しい方向に私を得ることができる任意の入力や説明は非常に高く評価されます。

よろしく

+0

データをbigqueryにストリーミングすることができます。データストアは複雑な分析には適していない可能性があります。 – marcadian

+0

私はそれを合計すると思います。もし私がカウントアグリ関数が必要なのであれば、私はGAEの "datastore statistics api"を使うことができます。しかし、それ以上の機能、より多くの集約関数、さらに複雑なクエリをリアルタイムで実行する必要がある場合は、BigQueryが必要です(データストアからデータをストリーム配信する必要があります)。 – shadyhossin

+0

ちょうどあなたの説明からbigqueryを使用して、データストアにデータを入れる必要はないと思っています。ちょうどbigquery – marcadian

答えて

0

はい、パフォーマンス面では、カウンターが問題に適しています。ストレージサイズや、新しいタイプの統計情報を導入するたびにカウンタを作成する必要があることなど、いくつかの欠点があります。

現在の「訪問」エンティティに加えて、集計されたデータをデータストアのシャード・カウンターに保存することもできます。これらのカウンタは、リアルタイムで更新することも、タスクキューの1つでタスクを更新することもできます。現在の訪問エンティティのさまざまなカウンタを作成するタスクを作成するのはかなり簡単です。

シャーディングは、複数の「基礎をなす」エンティティを作成する方法であり、結合して意味のあるデータを表現します。シャーディングは、同時更新によるパフォーマンスの問題がないことを保証するために行われます。Google Documentation:

から

あなたは、あなたが積み重なり、タイムアウトに開始するシリアル化された書き込み として競合を持つことになり、カウンタと更新率 が速すぎだった単一のエンティティを持っていた場合。この問題を解決する方法は、 リレーショナル データベースから来ている場合は少し直感的です。この解決策は、App エンジンデータストアからの読み取りが非常に高速で安価であるという事実に依存しています。 の競合を減らす方法は、シャードされたカウンターを構築することです。カウンターをN の異なるカウンターに分割します。カウンターを増分したいときは、ランダムにシャードの1つを として選択し、増分します。合計カウントが であることを知りたい場合は、すべてのカウンターシャードを読み取って、 個の個数を合計します。あなたが持っている破片が多いほど、スループットは高くなります。 あなたはあなたのカウンターを増分します。この手法は のカウンタだけでなく、多くの重要なスキルを学ぶことができます。 多くの書き込みでアプリケーション内のエンティティを検出し、 を破棄する良い方法を見つけることです。

さらに詳しい情報と役立つ例については、リンクをご覧ください。

+1

これは正しい答えであることがわかりました。私はBigQueryを使用することに決めましたが、リレーショナルデータベースから来ているので、よりシンプルでわかりやすく見つかりましたが、クエリは私が望むよりも時間がかかりますので、最適なソリューションではありません。このボリューム(と希望のスピード)のリアルタイムデータ表示では、これがこのケースの適切な解決策であることがわかりました。ありがとうございました。 – shadyhossin

0

私が知っているように、データストアは、集計をサポートしていない、またはたとえばクエリ結果の数 を取得。

これは当てはまりません。 1行のコードでクエリから返されるエンティティの数を取得できます。クエリ自体はキーのみでもよく、非常に高速で基本的には無料です。

+0

多くのエンティティがある場合は速くはありません。より多くのエンティティは、より遅く取得します。また、操作自体だけでなく、ネットワークも考慮する必要があります。 –

関連する問題