gpt4 book ai didi

java - 使用 Jetty 进行 HTTP/2 优先级和依赖性测试

转载 作者:可可西里 更新时间:2023-11-01 17:35:30 25 4
gpt4 key购买 nike

优先级和依赖性:

这里我做了简单的测试。但结果似乎不太好。我试图在同一个连接的for循环中发出100个请求(请求url是相同的,我想知道这部分是否影响结果)。

如果index是i,那么我的request stream_id是i,dependent stream_id是100+i。如果我们的假设是正确的,请求永远得不到响应,因为没有从 101 到 200 的 stream_id。

但是结果显示设置依赖和不设置依赖没有区别。我没有超时也没有等待,一帧一帧的拿到了响应数据。还有一些其他相关的测试,起点是让依赖于其他流的流先发送,然后流依赖。但结果是一样的。我还在思考结果的原因。谁能帮我?非常感谢。

代码在这里:

public void run() throws Exception
{
host = "google.com";
port = 443;
//client init
HTTP2Client client = new HTTP2Client();
SslContextFactory sslContextFactory = new SslContextFactory(true);
client.addBean(sslContextFactory);
client.start();

//connect init
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
Session session = sessionPromise.get(10, TimeUnit.SECONDS);

//headers init
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);

final Phaser phaser = new Phaser(2);

//multiple request in one connection
for(int i=0;i<100;i++)
{
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
PriorityFrame testPriorityFrame = new PriorityFrame(i, 100+i, 4, true);
HeadersFrame headersFrame = new HeadersFrame(0, metaData, testPriorityFrame, true);

//listen header/data/push frame
session.newStream(headersFrame, new Promise.Adapter<Stream>(), new Stream.Listener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersFrame frame)
{
System.err.println(frame+"headId:"+frame.getStreamId());
if (frame.isEndStream())
phaser.arrive();
}

@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
System.err.println(frame +"streamid:"+ frame.getStreamId());
callback.succeeded();
if (frame.isEndStream())
phaser.arrive();
}

@Override
public Stream.Listener onPush(Stream stream, PushPromiseFrame frame)
{
System.err.println(frame+"pushid:"+frame.getStreamId());
phaser.register();
return this;
}


});
}
phaser.awaitAdvanceInterruptibly(phaser.arrive(), 5, TimeUnit.SECONDS);

client.stop();
}

最佳答案

Jetty 项目尚未实现 HTTP/2 请求优先级排序。

我们正在讨论这对服务器是否有用,服务器关心的是尽可能快地写回响应。

让一个客户端改变请求的优先级,或者发出一个请求时知道实际上它首先想要另一个请求得到服务,这对于同时必须为其他 10,000 个客户端提供服务的服务器来说是一项大量工作连接到它。

当我们服务器为相关请求重新计算优先级树时,它可能已经为请求提供了服务。

当客户端意识到它必须更改请求的优先级时,它的整个响应可能已经在进行中。

话虽如此,我们当然对真实世界的用例感兴趣,在这些用例中,服务器执行的请求优先级排序会产生真正的性能提升。我们只是还没有看到它。

我很想听听您为什么对请求优先排序感兴趣以及您如何利用它。您的回答可能会插入 Jetty 项目实现 HTTP/2 优先级。

关于java - 使用 Jetty 进行 HTTP/2 优先级和依赖性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com