2013-08-01 3 views
2

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

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

Есть ли способ, которым я могу гарантировать, что не более 3 активных запросов CFHTTP?

+0

Я хотел бы начать с того, чтобы сделать так много запросов, которые действительно необходимы. Если это не так, вы можете просто сделать cfhttp, за которым следует 1-й сон внутри цикла. –

+0

Чем больше запросов я могу сделать как можно быстрее, тем эффективнее будет приложение. Проблема, с которой я столкнулась во сне, заключается в том, что вызовы cfhttp все еще могут стоять в очереди, а затем несколько запросов, в то же время приводя к превышению порогового значения. – CPB07

+0

Вы используете _standard_ или _enterprise_ издание ColdFusion? –

ответ

0

Я думаю, вам понадобится реализовать какой-то виджет ведения журнала как часть вашего процесса. Журнал будет отслеживать частоту запроса. Если порог не выполняется, вы просто пропустите эту итерацию своего вызова CFHTTP. Я не имею в виду журнал файлов или журнал базы данных, но что-то реализовано в приложении или даже запрашивает область действия в зависимости от вашей реализации. Невозможно дросселировать сам CFHTTP. Это в основном упрощенная оболочка Java-библиотеки Java, которая затем переходит прямо в базовую операционную систему.

+0

Будет ли иметь переменную приложения, которая хранит GetTickCount из предыдущих трех запросов и проверяет, что если время с первого элемента больше 1 секунды, то может ли следующий вызов CFHTTP быть возможным решением? – CPB07

0

Если вы ограничиваете одновременными запросами, тогда применяется первая часть этого ответа. Если вы хотите ограничить количество запросов в секунду, то бит в конце применяется. Вопрос типа спрашивает обе вещи.

Если я правильно понял, у вас есть несколько потоков (либо как запросы CF обрабатываются, либо создаются сами потоки CF), которые все должны совершать вызовы в тот же самый ограниченный скоростью домен. Что вам нужно - это центральный способ координирования доступа в сочетании с хорошим способом управления выполнением программы.

Я не знаю каких-либо родственных пределов, которые могут поддерживать CF (я был бы счастлив, если бы ошибался), поэтому вам, вероятно, придется реализовать свои собственные. Недорогой способ сделать это - увеличить и уменьшить переменную allowed_conenctions в долговечном объеме, таком как приложение. Недостатком является то, что вам нужно внедрить проверку повсюду и что, если нет свободных соединений, вам придется как-то подождать.

Действительно, у вас есть resource poo l (разрешенных HTTP-соединений), и я предполагаю, что вы хотите, чтобы ваш код дождался, пока соединение будет бесплатным. CF делает это уже для соединений с базой данных.

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

Я не пробовал, но в теории, что-то вроде сниппета ниже должно работать:

//Application.cfc:onApplicationStart() 
application.http_pool = CreateObject("java","java.util.concurrent.Semaphore").init(3) 

//Meanwhile, elsewhere in your code 
application.http_pool.acquire() 
//Make my HTTP call 
application.http_pool.release() 

Вы можете даже обернуть объект HTTP, чтобы обеспечить эту функциональность без использования приобретаемой/релиз каждый времени, что сделает его более надежным.

EDIT Это вы хотите ограничить тарифы, посмотрите на guava, который имеет тот же общий интерфейс, что и Семафор, но реализует ограничение скорости для вас. Вам нужно будет добавить guava в classpath ColdFusion или использовать JavaLoader или использовать CF10, который имеет встроенные средства загрузки классов.

+0

Я не уверен, что, когда был отправлен каждый запрос, я установил инкрементную переменную Application.activeRequests до тех пор, пока она не станет 3, обертывайте операторы IF вокруг всех запросов, чтобы проверить, что текущее значение меньше 3, и иметь следующий IF-оператор после каждого запрос, который уменьшит 1 из переменной activeRequests, если ответ был получен, будет хорошим подходом? – CPB07

+0

Я думаю, что основным фактором в этом является то, что вы хотите, когда активируются активные запросы или ограничение скорости. Если вы счастливы, что ваш код сдался и выкинул ошибку, тогда будет применяться подход application.activeRequests. Если вы хотите подождать, у вас есть два варианта: запишите цикл while, чтобы спать/проверить или использовать блокирующий вызов. Петлевой подход грязный, но может быть достигнут в чистом коде CF. Если вы пишете обертку объекта HTTP вокруг объекта HTTP ColdFusion, вы можете скрыть цикл, но вы несете ответственность за обработку угловых дел самостоятельно. Если вы используете RateLimiter, то для вас это необходимо – barnyr

+0

Извините мое невежество, но я никогда не включал класс java в любой из моих проектов CF. Это что-то очень легко сделать? – CPB07

Смежные вопросы