0

今日のオンラインの多くのサービスは、私がしていることと同様のタスクを実行する必要があると確信しています。ユーザーには友達がいて、友達の最後のステータス更新日以降に、すべてのユーザーの友達のすべてのステータス更新を取得したいと考えています。

それは一口でしたが、ここに私が持っているものがあります:

ユーザーには 10 人の友達がいるとします。私がやりたいのは、彼のすべての友達の新しいステータス更新を取得することです. だから、私はそれぞれの友人の最終ステータス日で辞書を用意します。何かのようなもの:

for friend in user:
    dictionary['userId] = friend.id
    dictionary['lastDate'] = friend.mostRecentStatusUpdate.date

次に、サーバー側で、次のようなことを行います。

for dict in friends:
    userId = dict['userId]
    lastDate = dict['lastDate']
    # each get below, however, launches an RPC and does a separate table lookup, so if I have 100 friends, this seems extremely inefficient
    get statusUpdates for userId where postDate > lastDate

上記のアプローチの問題は、サーバー側で for ループの各反復が新しいクエリを起動し、それが RPC を起動することです。ですから、友達がたくさんいると、本当に効率が悪いように思えます。

このタスクをより効率的にするために構造を設計するより良い方法はありますか? Twitter は、新しいタイムラインの更新を取得するときに、そのようなことをどのように行っていると言えますか?

4

1 に答える 1

1

大まかに言うと、アプリ エンジンで規定されているマントラに従うことをお勧めします。

友達ごとに、既知の友達とその最新のステータス更新のコレクションを保持する必要があります。これにより、書き込み時に友達を更新できます。これは書き込みにはコストがかかりますが、読み取り時の処理とクエリを節約できます。これはまた、書くことより読むことの方が多いことを前提としています。

さらに、フレンドごとに N 個の最新の更新を表示しようとしているだけの場合は、NDB Structured プロパティを使用して Friend オブジェクトを格納することをお勧めします。この方法で、一致するデータ構造を作成できます。オブジェクトの一部として、ステータスの更新に対応するキーのコレクションを作成します。ステータスの更新が書き込まれたら、コレクションに追加し、場合によっては古いエントリを削除します (スペースが問題になる場合)。

このようにして、更新を取得する必要がある場合、より高価なクエリ タイプではなく、キーで更新を取得します。

追加のクエリを回避するこれに代わる方法は、キーだけではなく更新全体を保持することです。ただし、これはストレージとしてはかなり大きくなります。相互接続された 10 人のフレンドは、同じ更新プログラムの 100 バージョンを意味します。

于 2012-09-18T18:04:05.207 に答える