我们最近切换到亚马逊的新ALB(应用程序负载均衡器),并很高兴能够获得http2多路复用的好处。但看起来仍有一个HOL(线头)阻塞问题正在发生。
客户端能够并行请求图像,但仍需等待一段时间才能开始下载图像。我的猜测是因为AWS的Application Load Balancer终止了http2,然后通过http / 1与ec2实例进行通信,从而产生了HOL延迟。
我可能会错误地阅读此图表,如果是这样,有人可以向我解释为什么内容没有被更快地下载,换句话说,我希望绿色部分更小,蓝色条更快出现。 load balacner和ec2 instance 之间的网络是否会受到HOL的影响?是否有一些神奇的事情发生?
答案 0 :(得分:1)
我相信您所看到的内容可能与当前Chrome(约为v54)优先处理请求的方式有关。
Chrome使用HTTP / 2的独占依赖项(可以在解析页面并发现新资源时动态重新排列),以使所有流严格依赖于彼此。这意味着所有资源都是一个接一个地有效发送的。我写了一个小实用程序来解析chrome:// net-internals /#http2的输出,以便显示给定页面的树:https://github.com/deweerdt/h2priograph。
从流到另一个的依赖关系可以是独占的也可以不是。 RFC 7540的第5.3.1节涵盖了该部分:https://tools.ietf.org/html/rfc7540#section-5.3.1,这是他们在向A添加新流D时给出的示例:
不排他性:
A A
/ \ ==> /|\
B C B D C
独家:
A
A |
/ \ ==> D
B C / \
B C
让我们以此页面为例 Chrome仅使用独占依赖项,因此依赖关系树最初可能如下所示:
HTML
|
PNG
|
PNG
当发现javascript时,Chrome会在图片上方重新设置优先级(因为javascript更可能影响网页的呈现方式),因此Chrome会将JS放在HTML的正下方:
HTML
|
JS
|
PNG
|
PNG
因为所有请求都是以菊花链方式连接的,所以它可能看起来像你在发布的瀑布中一样接一个地执行请求,就像在HTTP / 1中一样,但它们不是,因为它们可以重新排序fly 和所有请求都会尽快发送到浏览器。
另一方面,Firefox将具有相同类型的资源共享相同的优先级,因此您应该能够在那里看到一些隔行扫描。
请注意,Chrome所做的事情并不等同于HTTP / 1所发生的事情,因为所有请求都已发送到服务器,因此服务器始终可以通过线路发送。除此之外,订购是动态的,因此如果在页面中发现更高优先级的资源,Chrome将重新排序优先级树,以便此新资源优先于现有的较低优先级资源。
答案 1 :(得分:0)
答案可能会迟到,但仍然如此。
AWS ELB文档明确指出:
因此,从本质上讲,您观察到的是前端连接上的多路复用请求,这些请求由ALB逐一处理,并等待后端答复,直到处理下一个前端请求并将其路由到目标为止。
您可以参考documentation中的“ HTTP连接”部分。