2010-04-26 12 views
5

Ciao Sto utilizzando ColdFusion per chiamare l'API last.fm, utilizzando un pacchetto cfc originario di here.Frequenza di limitazione delle chiamate a un API che utilizza la cache in ColdFusion

Sono preoccupato di passare oltre il limite di richieste, ovvero 5 richieste per indirizzo IP di origine al secondo, in media su un periodo di 5 minuti.

Il bundle cfc ha un componente centrale che chiama tutti gli altri componenti, che sono suddivisi in sezioni come "artista", "traccia" ecc ... Questo componente centrale "lastFmApi.cfc." è iniziata nella mia richiesta, e protratto per la durata dell'applicazione

// 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> 

Ora, se voglio chiamare l'API attraverso un gestore/regolatore, ad esempio mio gestore artista ... posso fare questo

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

Sono un po 'confuso verso il caching, ma sto memorizzando nella cache ogni chiamata all'api in questo gestore per 5 minuti, ma questo fa alcuna differenza, perché ogni volta che qualcuno colpisce una nuova pagina artista questo non conta come un nuovo colpito contro l'api?

Chiedendosi il modo migliore per affrontare questo

Grazie

risposta

3

Poiché si tratta di un semplice modello di dati, non avrei complicato le cose con i motori di cache personalizzati. Metterei semplicemente struct/query: searchTerm/result, timestamp da qualche parte. Ci si potrebbe fare questo:

<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ì, si dovrebbe mettere da qualche parte anche il metodo che eliminerebbe le chiavi struct dove la differenza timestamp viene gt quindi il periodo di cache di validità.

Il modello di facciata è consigliato per rendere questo modificabile in futuro.

Ci scusiamo per errori di battitura :)

+0

Ciao grazie per la tua risposta, sto solo cercando di capire meglio. Mi chiedo dove mettere * yourCacheStruct *, in application.cfc? Anche questo metodo sembra limitare le chiamate per funzione, piuttosto che le applicazioni? I. E puoi fare solo 5 richieste per indirizzo IP originario al secondo, in media su un periodo di 5 minuti. Queste richieste possono provenire da qualsiasi punto dell'applicazione, dal gestore di pagine dell'artista sopra, o forse da un gestore di pagine di traccia.Quindi l'applicazione deve garantire che tutte le chiamate da qualsiasi luogo non superino il limite – namtax

+0

Ho modificato il codice in questa risposta per dare una comprensione più chiara di come memorizzare la cache nello scope dell'applicazione. A lungo termine, potrei considerare di aggiungere un controller di cache che gestisca tutta la memorizzazione nella cache dei dati tramite alcune chiamate di funzione, piuttosto che riscriverlo in ogni metodo che deve fare uso del caching; ma questo dovrebbe darti un'idea di come è fatto. –

+0

Non sono sicuro del motivo per cui @zarko ha deciso di mettere 'cache =" 5 mins "nella definizione della funzione. Non fa nulla se non aggiungere alcuni metadati personalizzati. –

0

vorrei provare la cache personalizzata.

Può essere una struttura in cui le chiavi sono nomi di artisti o altri identificatori univoci delle voci.

Se si utilizza CF9 o Railo 3.1.2+ è possibile utilizzare la memorizzazione nella cache incorporata (funzioni CachePut, CacheGet ecc.), È in grado di gestire i timeout e tutto il resto.

Altrimenti è possibile memorizzare la cache in ambito Applicazione, ma sarà necessario includere la data/ora con ciascuna voce e controllarla sugli eventi della cache (get/put/remove) o anche su ogni richiesta.

+0

Ciao, grazie per la tua risposta .. penso che l'archiviazione della cache nello scope dell'applicazione mi faccia appello. Quindi presumo di controllare ogni voce aggiunta alla cache memorizzata e di assicurarmi che non superi il limite entro un intervallo di tempo specifico. – namtax