2017-10-16 3 views
0

特定のキーで最新のレコードをdbに書きたい。もし私が記録を持ってタイムスタンプを持っていれば、それは簡単でしょう。しかし、私はタイムスタンプの代わりにレコードのシーケンス番号を持っています。タイムスタンプを使用せずに最新のデータを書き込む

はまた、シーケンス番号は大きな値(2^16)に到達した後に0にリセットされます。ただし、シーケンス番号は2^16に達していなくてもいつでもリセットできます。

私はすべてのレコードを追加し、最大のシーケンス番号を持つレコードを読むことができます。リセット後に問題が発生します(リセットはいつでも発生する可能性があるため)。

他のオプションは、軽量トランザクションを使用することですが、私はそれは同時実行を保証するかはわかりません。また、パフォーマンスに大きな影響を与える可能性があります。

これを行うにはどうすればよいですか。私はCassandra DBを使用しています。そのは通常、イベントのログを維持し、その中で最初のレコードを読み込むことで行われた最新値については、

答えて

0

。新しいタイムスタンプ(またはtimeuuid)を挿入すると、いつでも生成することができます。以下のような何か:

CREATE TABLE record (
    id text, 
    bucket text, 
    created timeuuid, 
    info blob, 
    PRIMARY KEY ((id, bucket), created) 
) WITH CLUSTERING ORDER BY (created DESC) 

次にバケットが大きくなりすぎたパーティションを防止するための「今日」であるSELECT * FROM record WHERE id = 'user1' AND bucket = '2017-09-10' LIMIT 1;。衝突について心配する前に、timeuuidでホストごとに1ミリ秒あたり10kの書き込みがあります。

あなたは線形化の一貫性の要件を持っているなら、あなたは、(適切に使用されている場合、それを保証する軽量取引)のPaxosや飼育係のような外部のロックシステムを使用する必要があります。分散システムでの事のようなものは、より複雑で、あなたは通常通りの書き込みをするのと同じスループットを得ることは決してないだろうという。

関連する問題