2

テーブルのコンテンツを確実に取得し、ギャップやオーバーラップなしで変更するにはどうすればよいですか? 時間の経過とともにテーブルの一貫したビューに終わろうとしています。

最初にデータベースにクエリを実行してから、変更フィードをサブスクライブできますが、これらのクエリの間に変更が発生したギャップが生じる可能性があります。

または、最初に変更をサブスクライブしてからテーブルをクエリすることもできますが、クエリで既に処理されている変更フィードで変更が発生する可能性があります。

この場合の例:

A subscribe 'messages'
B add 'messages' 'message'
A <- changed 'messages' 'message'
A run get 'messages'
A <- messages

ここで、A はメッセージ クエリを送信する前に「変更された」メッセージを受信し、メッセージ クエリの結果には変更されたメッセージが含まれています。おそらく、A はクエリ結果を受け取る前に、変更されたメッセージを単に無視することができます。(同じ接続で) クエリの後に受け取った変更が、前のクエリにまだ適用されていない、つまり同じスレッドで処理されることが保証されていますか?

おすすめの方法は?このユースケースに関するドキュメントは見つかりませんでした。

4

2 に答える 2

1

あなたが答えを思いついたと言ったのは知っていますが、私はこれをかなりやっています。

r.db('test').table('my_table').between(tsOne, tsTwo, {index: 'timestamp'});

そのため、私の仕事では、between前回の実行時からその瞬間までのデータを取得するインデックス付きクエリを実行しています。複数のプロセッサでスケーリングできるように、ジョブの last_run_time を追跡する構成テーブルでロックを実行できます。また、ロックが完了するのを待っている次のジョブを使用しているため、最初のプロセッサが実行されたbetweenにのみデータを取得します。それが役立つことを願っています!

于 2015-03-03T15:14:14.183 に答える
1

RethinkDB の Michael Lucy は次のように書いています。

これらのクエリの初期値は既に送信されているため、問題は.get.changesあり.order_by.limit.changesません。他のクエリの場合、現在それを行う唯一の方法は、クエリの変更をサブスクライブし、クエリを実行してから、変更フィードから読み取り、読み取り前の変更を破棄することです (これを行う方法は、何を読み取るかによって異なります)。しかし、それをハッキングする最も簡単な方法timestampは、更新を行うたびにインクリメントするフィールドをオブジェクトに追加することでしょう)。

return_initial2.1 では、ドキュメント スキーマを変更する必要なく、今説明したことを自動的に実行するオプションの引数を追加する予定です。

于 2015-03-04T11:32:42.487 に答える