2010-04-26 9 views
5

Hola, estoy usando ColdFusion para llamar a la API de last.fm, usando un paquete cfc procedente de here.Límite de frecuencia de llamadas a un API que utiliza caché en ColdFusion

Me preocupa sobrepasar el límite de solicitud, que es de 5 solicitudes por dirección IP de origen por segundo, promediada durante un período de 5 minutos.

El paquete cfc tiene un componente central que llama a todos los demás componentes, que se dividen en secciones como "artista", "pista", etc ... Este componente central "lastFmApi.cfc". se inicia en mi solicitud, y persistió durante la vida útil de la aplicación

// Application.cfc example 
    <cffunction name="onApplicationStart"> 
     <cfset var apiKey = '[your api key here]' /> 
     <cfset var apiSecret = '[your api secret here]' /> 

     <cfset application.lastFm = CreateObject('component', 'org.FrankFusion.lastFm.lastFmApi').init(apiKey, apiSecret) /> 
    </cffunction> 

Ahora si quiero llamar a la API a través de un controlador/controlador, por ejemplo, mi manejador artista ... Puedo hacer esto

<cffunction name="artistPage" cache="5 mins"> 
<cfset qAlbums = application.lastFm.user.getArtist(url.artistName) /> 
</cffunction> 

Estoy un poco confundido con el almacenamiento en caché, pero guardo en caché cada llamada a la API en este controlador durante 5 minutos, pero ¿esto marca alguna diferencia, porque cada vez que alguien visita una página de un artista nuevo esto todavía cuenta como nuevo golpear contra la api?

Se pregunta cuál es la mejor para hacer frente a esta

Gracias

Respuesta

3

Dado que es un modelo de datos simple, no complicaría las cosas con los motores de caché personalizados. Pondría simple struct/query: searchTerm/result, timestamp en alguna parte. No se podía hacer esto:

<cffunction name="artistPage" cache="5 mins"> 
    <cfargument name="artistName" type="string" required="true"/> 
    <cfif structKeyExists(application.artistCache, arguments.artistName) and structfindkey(application.artistCache, arguments.artistName)> 
     <cfif (gettickcount() - application.artistCache[arguments.artistName].timestamp) lte 5000 > 

     <cfset result = application.artistCache[arguments.artistName].result > 
    <cfelse> 
     <cfset qAlbums = application.lastFm.user.getArtist(arguments.artistName) /> 
     <cfset tempStruct = structnew()> 
     <cfset structNew.result = qAlbums > 
     <cfset structNew.timestamp = getTickCount() > 
     <cfset structInsert(application.artistCache, arguments.artistName, tempstruct, true) > 

     <cfset result = qAlbums > 

    </cfif> 

    <cfreturn result > 
</cffunction> 

EDIT: sí, se debería poner en algún método que también eliminar las claves struct donde se gt diferencia marca de tiempo, entonces su período de validez de caché.

Se recomienda un diseño de fachada para poder cambiarlo en el futuro.

Lo siento por los errores tipográficos :)

+0

Hola, gracias por su respuesta, solo tratando de obtener una mejor comprensión. Pregunto dónde colocaría * yourCacheStruct *, en la aplicación.cfc? ¿Este método también parece limitar las llamadas por función, en lugar de la aplicación de ancho? I.E solo puede realizar 5 solicitudes por dirección IP de origen por segundo, promediadas durante un período de 5 minutos. Estas solicitudes pueden provenir de cualquier lugar de la aplicación, desde el controlador de la página del artista anterior o desde un controlador de la página de seguimiento.Por lo tanto, la aplicación debe garantizar que todas las llamadas desde cualquier lugar no superen el límite – namtax

+0

Edité el código en esta respuesta para tener una idea más clara de cómo almacenar el caché en el alcance de la aplicación. A largo plazo, podría considerar agregar un controlador de caché que maneje todo el almacenamiento en caché de datos a través de unas pocas llamadas a función, en lugar de reescribirlo en cada método que necesita hacer uso del almacenamiento en caché; pero esto debería darte una idea de cómo se hace. –

+0

No estoy seguro de por qué @zarko decidió poner 'cache =" 5 mins "' en la definición de la función, sin embargo. No hace nada excepto agregar algunos metadatos personalizados. –

0

me gustaría probar el caché personalizado.

Puede ser una estructura donde las claves son nombres de artistas u otros identificadores únicos de sus entradas.

Si está utilizando CF9 o Railo 3.1.2+ puede usar el almacenamiento en caché incorporado (funciones CachePut, CacheGet, etc.), puede manejar los tiempos de espera y demás.

De lo contrario, puede almacenar el caché en el alcance de la aplicación, pero deberá incluir la marca de tiempo con cada entrada y verificarlo en eventos de caché (get/put/remove) o incluso en cada solicitud.

+0

Hola, gracias por sus response..i piense el almacenamiento de la memoria caché en las apelaciones ámbito de aplicación a mí. Entonces supongo que verifico cada entrada agregada a la caché almacenada, y me aseguro de que no exceda el límite dentro de un marco de tiempo específico. – namtax

Cuestiones relacionadas