Fallback cuando la API Transient falla

4

Estoy tratando de encontrar la mejor manera de resolver un problema que tengo con las API de terceros (OG, Foursquare, Yelp, etc.). Utilizo la API transitoria para llamar y almacenar los diversos datos con el fin de:

  1. No exceder los límites de API
  2. Aumentar la velocidad de carga

Sin embargo, el problema surge cuando una nueva llamada a la API se produce un error por cualquier motivo; O bien hubo un problema con la conexión, o la API en sí misma estaba inactiva (hola foursquare). Esto conduce a un escenario en el que no tiene datos nuevos y se agotó el tiempo de espera de los datos antiguos (que es esencialmente lo que desencadenó la generación de un nuevo transitorio). ¿Cómo lidias con tales situaciones?

La solución que tengo en mente es crear una opción estática dentro de la función de actualización que almacena una respuesta exitosa o muestra la última respuesta exitosa en un error, por ejemplo:

<?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;

}

?>

¿Esto tiene sentido, o alguien tiene una solución más elegante en mente?

¡Gracias!

    
pregunta Noel Tock 24.01.2012 - 00:08

3 respuestas

5

Mark Jaquith creó un método de "Transitorios TLC" que podría resultarle útil. Esencialmente, implementa una interfaz transitoria que realiza la caducidad de software y la actualización de fondo.

enlace

La idea es que defina una función para hacer la llamada que recibe los datos, luego defina el transitorio y pase esa función como una devolución de llamada. Cuando realice esta llamada, obtendrá los datos si es necesario y los devolverá, almacenándolos de forma transitoria durante el período de tiempo definido. La actualización "suave" significa que siempre devuelve los datos almacenados en caché inmediatamente y hace que la actualización se realice después del hecho, en segundo plano (utilizando un trabajo wp-cron).

Esto también tendría la ventaja de devolver siempre los datos "antiguos" hasta que se produzca una actualización exitosa. La forma en que esto se maneja con su código es que usted hace que su función de devolución de llamada lance una excepción si la recuperación de los datos no tiene éxito por cualquier motivo.

    
respondido por el Otto 24.01.2012 - 06:43
1

Puede establecer otro transitorio en caso de éxito con un largo tiempo de espera. Luego, si el primer tiempo se agota y usted recibe un error, tendrá un transitorio de respaldo. Si hay un éxito, ambos transitorios se actualizan.

Es similar a tu idea, así que creo que puedes ir en cualquier dirección.

    
respondido por el Rob Vermeer 24.01.2012 - 00:19
0

Tiendo a hacer lo siguiente:

1) Genere los datos en un evento o programa de back-end. El transitorio está configurado para durar MUCHO más de lo que esperaría que se actualice. También "hago una copia de seguridad" de los datos utilizando add_option mientras configuro la opción para no cargar automáticamente. Si se produce un error en la llamada a la API, simplemente no vuelvo a configurar los datos y no se tocan los datos antiguos.

2) En la pantalla, verifique si hay transitorios. Si el transitorio existe, visualícelo. De lo contrario, sáquelo de la opción, muéstrelo y luego vuelva a colocarlo en la memoria caché para que las solicitudes futuras se extraigan de la memoria caché. Utilizo este método porque a veces en los entornos de memcached, los transitorios son desalojados. En lugar de volver a ejecutar la solicitud pesada, puedo extraer los datos de la opción.

    
respondido por el tollmanz 24.01.2012 - 05:37

Lea otras preguntas en las etiquetas