Как расставить приоритеты и регулировать запросы в Java? - PullRequest
2 голосов
/ 06 декабря 2011

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

Не только мне нужно регулировать, но и расставлять приоритеты для запросов.Мне нужно убедиться, что запросы в реальном времени имеют приоритет над пакетными запросами.

Наше приложение работает на кластерном сервере Jboss.Каков наилучший способ расставить приоритеты и ограничить запросы?

Ответы [ 4 ]

0 голосов
/ 21 августа 2013

Для этого вы можете использовать систему с открытым исходным кодом: http://code.google.com/p/valogato/

0 голосов
/ 06 декабря 2011

Чтобы справиться с регулированием в кластерной среде, обратите внимание на реализацию алгоритма сегмента токенов.

По своей сути, число X токенов помещается в сегмент каждый интервал времени Y.Каждый раз, когда вам нужно сделать что-то, что блокируется, вы удаляете токен из корзины.Если корзина пуста, вы блокируете, пока не получите токен.Отрегулируйте X и Y, чтобы обеспечить разумное регулирование.Это можно сделать с помощью пользовательского сервера.Я даже видел несколько реализаций, использующих преимущества Memcached.

Что касается приоритетной очереди, вы можете захотеть взглянуть на PriorityQueue или BlockingPriorityQueue.

0 голосов
/ 07 февраля 2012

Вы можете использовать DelayQueue для регулирования запросов. Вот пример по дросселированию:

https://gist.github.com/1713624

0 голосов
/ 06 декабря 2011

У меня есть приложение, которое в значительной степени соответствует тем же требованиям.У меня есть поток процессора, который содержит ссылку на несколько BlockingQueue с.

Сам класс потока выглядит следующим образом:

public class Processor extends Thread{
   BlockingQueue<Msg> highPriorityQueue = new BlockingQueue<Msg>();
   BlockingQueue<Msg> mediumPriorityQueue = new BlockingQueue<Msg>();
   BlockingQueue<Msg> lowPriorityQueue = new BlockingQueue<Msg>();

   public void ProcessMessage(Msg msg, int priority){
      // Add msg to one of the queues according to priority
   }
   public void run(){
      while(!interrupted()){
          // process messages by priorities
          if(highPriorityQueue.size()>0){
          }
          if(mediumPriorityQueue .size()>0){
          }
          if(lowPriorityQueue .size()>0){
          }
      }
   }
}
...