12

API 呼び出しのキャッシングに関する一般的な質問があります。この例では、Github API への呼び出しです。

リポジトリのファイル名と README の内容を表示するページがアプリにあるとしましょう。これは、それを取得するためにいくつかの API 呼び出しを行う必要があることを意味します。

さて、間に memcached のようなものを追加したいとしましょう。必要がなければ、これらの呼び出しを何度も行う必要はありません。

これについて、通常はどのように対処しますか?Github で Webhook を有効にしないと、キャッシュの有効期限が切れるかどうかを知る方法がありません。HEAD の現在の sha を取得するために 1 回の呼び出しをいつでも行うことができ、それが変更されていない場合は、代わりにキャッシュを使用します。しかし、それはレポ レベルであり、ファイル レベルではありません。

object-sha でそのようなことができると想像できますが、とにかく API を呼び出してそれらを取得する必要がある場合、キャッシュの目的が無効になります。

あなたならどうしますか?現在、prose.io のようなサービスにはキャッシュがないことは知っていますが、そうする必要があるとすれば、どのようなアプローチになるのでしょうか?

ありがとう

4

1 に答える 1

18

HTTP キャッシングを使用するだけでユースケースに十分でしょうか? HTTP キャッシングの目的は、すでに新しい応答がある場合に要求を作成しない方法を提供することだけではなく、キャッシュに既にある応答が有効かどうかを (サーバーが完全な応答を送信することなく) 迅速に検証できるようにすることでもあります。新鮮な場合は再度応答します)。

GitHub API の応答を見ると、GitHub が関連する HTTP ヘッダー (ETag、Last-modified、Cache-control) を正しく設定していることがわかります。

したがって、次のように GET を実行するだけです。

GET https://api.github.com/users/izuzak/repos

これは次を返します。

200 OK
...
ETag:"df739f00c5053d12ef3c625ad6b0fd08"
Last-Modified:Thu, 14 Feb 2013 22:31:14 GMT
...

次回は、同じリソースに対して GET を実行しますが、実際には条件付き GET になるように、関連する HTTP キャッシュ ヘッダーも提供します。

GET https://api.github.com/users/izuzak/repos
...
If-Modified-Since:Thu, 14 Feb 2013 22:31:14 GMT
If-None-Match:"df739f00c5053d12ef3c625ad6b0fd08"
...

見よ、サーバーは 304 Not modified 応答を返し、HTTP クライアントはその応答をキャッシュからプルします。

304 Not Modified

したがって、GitHub API は HTTP キャッシングを正しく行うので、それを使用する必要があります。確かに、HTTP キャッシングもサポートする HTTP クライアントを使用する必要があります。最善の方法は、304 Not modified 応答を受け取った場合、GitHub は残りの API 呼び出しクォータを減らさないことです。参照: https://docs.github.com/en/rest/overview/resources-in-the-rest-api#conditional-requests

GitHub API もCache-Control: private, max-age=60ヘッダーを設定するため、60 秒の鮮度があります。つまり、60 秒以内に行われた同じリソースへのリクエストはサーバーに対して行われません。

リポジトリ内の何かが変更された場合に確実に変更されるリソース (たとえば、HEAD の sha を示すリソース) に対して単一の条件付き GET 要求を使用することについてのあなたの推論は、合理的に聞こえます。確かに変更されていないため、個々のファイルを確認する必要はありません。

于 2013-02-15T08:40:13.353 に答える