web-dev-qa-db-ja.com

一時APIが失敗したときのフォールバック

私はサードパーティのAPI(OG、Foursquare、Yelpなど)に関する問題を最もよく解決する方法を見つけようとしています。一時的なAPIを使用して、さまざまなデータを呼び出して保存します。

  1. APIの制限を超えない
  2. ロード速度を上げる

ただし、問題は、新しいAPI呼び出しがいずれかの理由でエラーで発生した場合に発生します。接続に問題があるか、またはAPI自体が停止しています(hello foursquare)。これにより、新しいデータがなく、古いデータがタイムアウトするというシナリオが発生します(これが基本的に、生成する新しいトランジェントを引き起こしたものです)。そのような状況にどう対処しますか?

私が念頭に置いている解決策は、成功した応答を格納するか、エラーが発生したときに最後に成功した応答を表示するrefreshオプション内に静的オプションを作成することです。

<?php

function refresh_api_data() {

... perform API call ...

if ( $response->status == 'error' ) {
     $response = get_option( 'fallback_data' );
} else {
     update_option( 'fallback_data', $response );
}

return $response;

}

?>

これは理にかなっていますか、それとも誰かがよりエレガントな解決策を念頭に置いていますか?

ありがとうございました!

4
Noel Tock

Mark Jaquithはあなたが役に立つかもしれない "TLC Transients"メソッドを作りました。基本的に、それはソフト期限切れとバックグラウンド更新をする一時的なインターフェースを実装します。

https://github.com/markjaquith/WP-TLC-Transients

データを取得する呼び出しを実行する関数を定義してから、トランジェントを定義し、それをコールバックとしてその関数に渡します。この呼び出しを行うと、必要に応じてデータが取得されて返され、定義された期間、一時的に格納されます。 「ソフト」更新とは、常にキャッシュされたデータをすぐに返し、更新をバックグラウンドで(wp-cronジョブを使用して)実行させることを意味します。

これには、正常に更新されるまで常に「古い」データを返すという利点もあります。これが彼のコードによって処理される方法は、データの検索が何らかの理由で失敗した場合にあなたがあなたのコールバック関数にExceptionを投げるようにすることです。

5
Otto

あなたは長いタイムアウトで成功時に別の一時的なものを設定することができます。その後、最初の1つがタイムアウトしてエラーが発生した場合は、一時的なバックアップが必要になります。成功すると、両方のトランジェントが更新されます。

それはあなたの考えと似ているので、私はあなたがどちらの方向にも行けると思います。

1
Rob Vermeer

私は以下のことをする傾向があります。

1)バックエンドイベントまたはスケジュールに基づいてデータを生成します。トランジェントは、リフレッシュされると予想されるよりもずっと長く最後に設定されます。自動ロードしないオプションを設定しながら、add_optionを使用してデータを「バックアップ」します。 API呼び出しでエラーが発生した場合は、データを再度設定しないで、古いデータは変更されません。

2)ディスプレイに過渡現象がないか確認します。トランジェントが存在する場合はそれを表示します。そうでなければ、オプションからそれを引き出し、それを表示し、そしてそれをキャッシュに戻すので将来の要求はキャッシュから引き出される。時々memcached環境では、トランジェントが追い出されるので、私はこの方法を使います。ヘビーリクエストを再度実行するのではなく、オプションからデータを取得できます。

0
tollmanz