2

私は現在REST APIに取り組んでいます。API が返すリソースは、データベースからの膨大なデータ (DB の数千万行) であると予想されます。データを HTTP 応答に書き込むときに大量のメモリを消費しないようにするために、ページネーションは必須です。

クライアント要求の間に DB の行の削除/追加がある場合、データの整合性を確認するにはどうすればよいですか?

例えば:

page 1: [ John, Mary, Harry, David, Joe ]
page 2: [ Mike, Don, Alex ]

クライアントがページ 1 を要求し、(ファイル/メモリ) にローカルに保存した後、ページ 2 を要求する前に、データは次のように変更されます。

page 1: [ John, Mary, Harry, David, **Mike** ]
page 2: [ Don, Alex, **Terry** ]
4

2 に答える 2

3

真の RESTful (したがってサーバー側のステートレス) な回答は次のようになります。

  • 最初の 5 つのレコード (最後のレコードは "Joe") を要求し、
  • 次に、"Joe" より上位の 5 つのレコード [1] を求めます。
  • 等々。

この戦略では、ページ #2​​ に「Mike」と「Terry」が表示されます。

[1] ソート順 (アルファベット順またはその他) が必要です。

于 2013-03-08T09:00:11.517 に答える
1

これに対する 1 つの解決策は、クエリの結果セットを表す「一時的な」リソースを返し、クライアントが GET を使用してそれをページ分割できるようにすることです。

例えば:

GET /big-query/all-users
Returns: /query-results/12345 

GET /query-results/12345?page=1
Returns: users 1-20

GET /query-results/12345?page=2
Returns: users 21-40

このソリューションの明らかな問題は、実際のユーザーへの変更がクエリの結果セットに反映されないことです。そのため、API ドキュメントでそのことを明確にする必要があります。また、妥当な時間の経過後に結果セットを「失効」させて、(a) 古い状態になるのを防ぎ、(b) サーバーが人質に保持しているメモリを取得できるようにすることをお勧めします。

もう 1 つの方法は、クエリを毎回再発行し、結果セットにページ付けして、返すデータの適切なチャンクを見つけることです。これはステートレスであり、以前のアイデアのような排除戦略は必要ありませんが、クエリが毎回再実行されることを意味します。それの良い部分は、結果が各ページネーションで可能な限り正確になることです.

于 2013-03-08T03:46:03.627 に答える