如何在Java中确定请求的优先级和限制?

时间:2011-12-06 15:13:07

标签: java throttling

我的应用程序处理Web服务请求(实时请求和批处理程序触发请求)并调用外部系统来检索数据。 外部系统对请求有限制,它可以在几秒钟内处理x次呼叫。

我不仅需要节流,还需要优先处理请求。我需要确保实时请求优先于批量请求。

我们的应用程序在集群Jboss服务器上运行。优先处理请求的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

我的应用程序几乎有相同的要求。我有一个处理器线程,其中包含对多个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){
          }
      }
   }
}

答案 1 :(得分:0)

要处理集群环境中的限制,请查看实现令牌桶算法。

在它的核心,每隔Y个时间间隔将X个令牌放入一个桶中。每次需要执行限制操作时,都会从存储桶中删除令牌。如果存储桶为空,则会阻塞直到获得令牌。调整X和Y以提供合理的节流。这可以使用自定义服务器完成。我甚至看到了一些利用Memcached的实现。

对于优先排队,您可能需要查看PriorityQueue或BlockingPriorityQueue。

答案 2 :(得分:0)

您可以使用DelayQueue来限制请求。以下是关于限制的示例:

https://gist.github.com/1713624

答案 3 :(得分:0)

您可以使用开源系统:http://code.google.com/p/valogato/