Ограничение скорости вызовов к API с использованием кеша в ColdFusion - PullRequest
5 голосов
/ 26 апреля 2010

Привет! Я использую ColdFusion для вызова API last.fm, используя пакет cfc, полученный из здесь .

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

В пакете cfc есть центральный компонент, который вызывает все остальные компоненты, которые разбиты на такие разделы, как «Artist», «Track» и т. Д. Этот центральный компонент «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>

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

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

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

Хотите знать, как лучше справиться с этим

Спасибо

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

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

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

РЕДАКТИРОВАТЬ: да, вы должны также поместить куда-нибудь метод, который удалял бы структурные ключи, где разница во времени - это gt, чем период действия вашего кэша.

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

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

0 голосов
/ 26 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...