Cassandra の結果整合性と最終書き込み優先のセマンティクスが原因で、ユース ケースがデータの差異を許容する方法がわからないため、これは単純なソリューションです。しかし、Cassandra でよくあることですが、データをさまざまなビュー (またはクエリの方法) をサポートする方法は、データを非正規化して複数の方法で保存することです。
CREATE TABLE latest_metrics (
metric_name text,
schedule_id int,
latest_time timestamp,
latest_value double,
PRIMARY KEY (metric_name, schedule_id)
);
にデータを挿入するmetrics
と、同時に にも書き込みlatest_metrics
ます (これは、リアルタイム フィードからのように、データが常に単調に増加する時間で入力されることを前提としています)。
INSERT INTO metrics (schedule_id, time, value) VALUES (?, ?, ?);
INSERT INTO latest_metrics (metric_name, schedule_id, latest_time, latest_value)
VALUES ('WellKnownIdentifier', ?, ?, ?);
この場合、「最新」とは、実際のタイムスタンプフィールドの値ではなく、レコードが書き込まれた時期に関するものです。インターリーブされた時間を伴うデータを取り込む場合は、アプリケーション側でこれを処理する必要がある可能性があります。また、Cassandra 2.x で新しい新しい Compare-and-Set (CAS) 機能を使用することもできますが、そのために必要な Paxos プロセスは、書き込みパフォーマンスに深刻な影響を与えます。
INSERT INTO latest_metrics (...) VALUES (...) IF latest_time <= ?;
これらの仮定がすべてデータに当てはまる場合は、すべてのスケジュールの「最新」の値を簡単に照会できます。
SELECT schedule_id, latest_time, latest_value FROM latest_metrics WHERE metric_name = 'WellKnownIdentifier';