2

タイムライン用の Cassandra スキーマを設計したい:

私にはユーザーがいて、すべてのユーザーにタイムラインがあり、各タイムラインの値は文字列です。

すべてのユーザーには文字列のタイムラインがあるため、各ユーザーのタイムラインを最後からできるだけ早く入力する必要があります。

すべてのユーザーが 10000 個のタイムライン オブジェクトを持ち、10000 人のユーザーがいると見積もっているので、簡単に 1 億個のオブジェクトを持つことができます。これは、速度が非常に重要であることを意味します。

これは私が使用したコードですが、正しいですか?

$pool = new ConnectionPool('Keyspace', array('127.0.0.1'));
$cf = new ColumnFamily($pool, 'timeline');

// Insert a few records
$columns = array(microtime() => "event1", microtime() => "event2", microtime() => "event3", microtime() => "event4" );
$cf->insert('usera', $columns);
4

1 に答える 1

2

列キーとして使用TimeUUIDでき、複数のアプリケーション サーバーが同時にデータを書き込む場合でも一意のキーを確実に取得できます (ただし、2 つのアプリケーション サーバーがmicrotime同じユーザーに対してまったく同じ値で何かを挿入する可能性はほとんどありません)。通常のタイムスタンプと同じように時系列でソートされます。

最新のアイテムをより頻繁に表示することが予想される場合 (たとえば、ユーザーの最新の 10 個のタイムライン アイテムを表示する場合) は、逆コンパレータを使用することもできます。逆コンパレータを使用すると、Cassandra は最新のアイテムを最初にして、逆の順序で行を格納します。これは、最新の項目が Cassandra にとって最も見つけやすく、非常に優れたパフォーマンスが得られることを意味します。

考慮すべきもう1つのことは、行がどれだけ広くなるかです。タイムラインが 100 万程度のアイテムよりも長くなるとは思わない場合 (正確な数は、各アイテムに含まれるデータの量によって異なります)、ユーザーごとに 1 つの行を持つことでおそらくうまくいきます (ただし、もう一度使用してみてください)。そうしないと、最新の項目の読み取りが遅くなります)。ユーザーが何百万ものタイムライン アイテムを生成すると予想される場合は、ユーザーのタイムラインを多数の行に分割する方法を考える必要があります。おそらく、1 ユーザーあたり 1 か月または 1 日あたり 1 行です。読み取る必要がある行を見つけるためにクエリを実行する必要がないように、決定論的なものである必要があります。列は時間通りにソートされるため、時間を使用して複数の行に分割するのは自然です。

于 2013-02-28T07:28:32.853 に答える