【问题标题】:How to prioritize and throttle requests in Java?如何在 Java 中对请求进行优先级排序和限制?
【发布时间】:2011-12-06 15:13:07
【问题描述】:

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

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

我们的应用程序在集群的 Jboss 服务器上运行。确定请求优先级和限制请求的最佳方式是什么?

【问题讨论】:

  • 我之前确实看过那篇文章。我不确定建议的解决方案是否满足我的要求,因为它们中的大多数是用于节流而不是优先级。感谢您的帮助。

标签: java throttling


【解决方案1】:

我有一个几乎具有相同要求的应用程序。我有一个处理器线程,其中包含对多个BlockingQueues 的引用。

线程类本身如下所示:

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){
          }
      }
   }
}

【讨论】:

  • 谢谢 GETah!!。这在集群环境中是否易于管理?我的意思是集群环境中来自我的 n 个服务器的所有请求不应超过 x 次调用。
  • 如果您的服务器都是独立的,那么应该没有问题。否则,您需要某种通信来同步它们的状态
  • 他们不是。无论如何感谢您的帖子,我将检查如何在服务器之间同步它们的状态。
  • 另一种方法@Rams 是让集群中的一个服务器处理对您服务的所有请求。与在所有服务器之间同步状态相比,将请求发送到一台服务器可能更容易。
  • 不是说我没有使用集群中的其他服务器来处理吗?我可能必须更改负载平衡器设置对吗?原谅我的无知!!
【解决方案2】:

要在集群环境中处理节流,请研究实现令牌桶算法。

它的核心是每隔 Y 时间间隔将 X 个令牌放入一个桶中。每次你需要做一些被限制的事情时,你都会从存储桶中删除一个令牌。如果桶是空的,你会阻塞直到你得到一个令牌。调整 X 和 Y 以提供合理的节流。这可以通过自定义服务器来完成。我什至见过一些利用 Memcached 的实现。

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

【讨论】:

    【解决方案3】:

    您可以使用延迟队列来限制请求。下面是一个节流的例子:

    https://gist.github.com/1713624

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        相关资源
        最近更新 更多