java中如何确定某个请求的优先级?
我觉得这是一个非常小众的问题,所以我会尽可能地解释它。
简介:
我每秒发送约 500 个请求,我觉得我发送的请求越多,处理请求的速度就越慢(在某些时候它变得明显变慢)
问题:所以问题是在 Java 中有没有办法确定请求的优先级?我正在寻求的任何解决方案都是优化此类请求的速度。因此,在发送请求之前需要时间的任何答案都不是我所关心的。
信息:( 我希望这是足够的,如果不是请告诉我!)
- 我使用的库是 apache httpclients(但是如果解决方案需要,我可以切换)
- 我也在一台服务器/电脑上多线程处理请求。我希望这是有用的信息。
- CPU 使用率从 (5-15%) 不等- 我相信这些是测量值
我正在发送 2 种类型的请求,我只需要优先处理 1 种类型
- HTTP GET 请求 - 预期的 HTML 响应
- HTTP POST 请求 - 预期的 JSON 响应(虽然我不需要响应)
#2 是我想要优先处理的请求。我很少发送这个请求,但是当我发送它时,我需要它尽可能快。
想到的解决方案:我想出的唯一解决方案是停止/结束所有实时连接以执行我想要的请求,但是我认为这样做会花费大量时间导致解决方案成为浪费时间。
注意:你可以说我在这方面是个白痴,所以如果解决方案不存在或明显,我很抱歉,如果有重复,我也很抱歉..我找不到任何与此相关的问题。
回答
这可能是一种解决方法,因为它必须在发送请求之前执行。考虑到您的用例(每秒 500 个请求),我的建议是首先发送最关键的请求,方法是使用PriorityQueue.
由于您已经对消息进行批处理以发送它们,因此这种方法将有助于根据设置的优先级对批处理消息进行排序。
您可以先将请求包装到另一个包含priority字段的实体中。例如,一个骨架/基 PriorityRequest类:
public class PriorityRequest implements Comparable<PriorityRequest>
{
public int priority;
public PriorityRequest(int priority)
{
this.priority=priority;
}
@Override
public int compareTo(PriorityRequest request)
{
return Integer.compare(request.priority,this.priority);
}
}
并声明两个孩子,HttpPost并且HttpGet:
public class PriorityHttpPost extends PriorityRequest
{
public HttpPost post;
public PriorityHttpPost(int priority, HttpPost post)
{
super(priority);
this.post=post;
}
}
public class PriorityHttpGet extends PriorityRequest
{
public HttpGet get;
public PriorityHttpGet(int priority, HttpGet get)
{
super(priority);
this.get=get;
}
}
因此,当您创建请求时,您可以将它们插入到队列中,以便它们自动位于其优先级的基础上:
Queue<PriorityRequest> requestQueue = new PriorityQueue<>();
/*into the batch mechanism*/
requestQueue.add(new PriorityHttpPost(6,httpPost));
//...
requestQueue.add(new PriorityHttpGet(99,httpGet));
//...
这样,您可以保证具有较高优先级的请求在较低优先级的请求之前离开队列,因为它们将按降序排列。
Queue- | Get (99) | --> out
| Get (9) |
| Post (6) |
| Get (3) |
| Post (1) |
Queue- | Get (9) | --> out
| Post (6) |
| Get (3) |
| Post (1) |
(...)
最后,这种方法的一些额外功能(在某些用例中)包括能够定义哪些元素先行,哪些元素最后:
requestQueue.add(new PriorityHttpPost(INTEGER.MAX_VALUE, httpPostMax));
requestQueue.add(new PriorityHttpPost(INTEGER.MAX_VALUE-1, httpPostVery));
requestQueue.add(new PriorityHttpPost(INTEGER.MIN_VALUE+1, httpPostNotVery));
requestQueue.add(new PriorityHttpPost(INTEGER.MIN_VALUE, httpPostNoOneCares));
——
完美世界,是的,我知道..
Queue- | Post (MAX) | --> out
| Post (MAX-1) |
| ............ |
| ............ |
| Post (MIN+1) |
| Post (MIN) |