我的应用程序处理Web服务请求(实时请求和批处理程序触发请求)并调用外部系统来检索数据。 外部系统对请求有限制,它可以在几秒钟内处理x次呼叫。
我不仅需要节流,还需要优先处理请求。我需要确保实时请求优先于批量请求。
我们的应用程序在集群Jboss服务器上运行。优先处理请求的最佳方法是什么?
答案 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来限制请求。以下是关于限制的示例:
答案 3 :(得分:0)
您可以使用开源系统:http://code.google.com/p/valogato/