2010-04-26 5 views
5

Привет Я использую ColdFusion для вызова last.fm api, используя комплект cfc, полученный из here.Ограничение скорости звонка на Api с использованием кеша в ColdFusion

Я беспокоюсь о превышении лимита запроса, который составляет 5 запросов на исходящий IP-адрес в секунду, усредненный за 5-минутный период.

Комплект cfc имеет центральный компонент, который вызывает все остальные компоненты, которые разделяются на разделы, такие как «художник», «дорожка» и т. Д. Этот центральный компонент «lastFmApi.cfc». инициируется в моем приложении, и сохраняется в течение всей жизни приложения

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

Теперь, если я хочу, чтобы вызвать апи через обработчик/контроллер, например, мой обработчик художника ... Я могу сделать это

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

Я немного смущен к кешированию, но кэширую каждый вызов api в этом обработчике в течение 5 минут, но это имеет значение, потому что каждый раз, когда кто-то попадает на новую страницу художника, это все равно считается свежим ударил по api?

Хотите знать, как лучше решить эту

Благодарности

ответ

3

Поскольку это простая модель данных, я бы не усложнил работу с помощью собственных механизмов кэширования. Я бы поставил простой struct/query: searchTerm/result, timestamp где-нибудь. Там вы можете сделать это:

<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: да, вы должны поставить где-нибудь также метод, который будет удалять ключи STRUCT где разница временной метки Gt, то ваш срок действия кэша.

Рекомендуется использовать шаблон фасада, чтобы сделать его возможным в будущем.

Извините за опечатки :)

+0

Привет, спасибо за ваш ответ, просто пытаясь получить лучшее понимание. Интересно, где бы я разместил * yourCacheStruct *, в application.cfc? Также этот метод, по-видимому, ограничивает вызовы для каждой функции, а не приложения в целом? I.Е вы можете сделать только 5 запросов на исходящий IP-адрес в секунду, усредненный за 5-минутный период. Эти запросы могут поступать из любого места приложения, из обработчика страницы исполнителя или, возможно, из обработчика страницы трека.Таким образом, приложение должно гарантировать, что все вызовы из любого места не превышают лимита. – namtax

+0

Я отредактировал код в этом ответе, чтобы дать более четкое представление о том, как хранить кеш в области приложения. В конечном итоге я мог бы рассмотреть возможность добавления контроллера кэша, который обрабатывает все кэширование данных с помощью нескольких вызовов функций, а не переписывает их в каждом методе, который должен использовать кеширование; но это должно дать вам представление о том, как это делается. –

+0

Я не уверен, почему @zarko решил поместить «cache =» 5 минут »в определение функции. Он не делает ничего, кроме добавления некоторых пользовательских метаданных. –

0

Я хотел бы попробовать пользовательский кэш.

Это может быть структура, в которой ключи являются именами художников или другими уникальными идентификаторами ваших записей.

Если вы используете CF9 или Railo 3.1.2+, вы можете использовать встроенное кеширование (функции CachePut, CacheGet и т. Д.), Оно может обрабатывать вам таймауты и прочее.

В противном случае вы можете хранить кеш в области Приложения, но при этом нужно будет указывать метку времени с каждой записью и проверять ее на события кеша (get/put/remove) или даже на каждый запрос.

+0

Привет, спасибо за ваш ответ. Я думаю, что хранение кеша в области приложения обращается ко мне. Тогда я предполагаю, что я проверяю каждую запись, добавленную в сохраненный кеш, и убедитесь, что она не превышает лимит в течение определенного периода времени. – namtax