HTTP 推送功能最新缺点&优点解剖

本文探讨了HTTP推送技术如何在服务器思考时间内推送关键资源,从而减少首次渲染的时间。相较于预加载,HTTP推送能在服务器处理请求时提前发送CSS和JS文件,有效利用网络带宽并加快页面加载速度。
导读上周我在斯达哥尔摩住了几天,出席了 HTTP 研讨会,参与了不少吸引人的讨论。其中一次是关于 HTTP 推送及其优缺点、早期实验结果的。

由于早期实验部署结果不那么理想,人们对 HTTP 推送大体持着怀疑态度,不过我想分享下自己更乐观一些的观点。

HTTP 推送能做哪些预加载不能做的事?

从怀疑者那里一再听到的观点是,“推送相对于预加载来说,只不过节省了一次 RTT(Round Trip Time)而已”。在实践中,这并非总是对的,有一个使用案例,推送可以完成,但预加载无法做到。

利用服务器思考时间

如今,HTML 响应很少只是单纯的静态资源了。它们通常都是通过数据库获取所需的信息、使用高级语言(可能略微慢一些)动态生成的。虽然后端响应时间确实可以而且应当优化,但几百毫秒的响应时间也并不常见。
有一个常见的建议,“提早 flush” HTML,在查询数据库并构建动态内容的同时,发送 HTML 的首个 chunk 块。但是,并非所有服务端的构架都能这么简单地实现。
另外一个让问题变得困难的因素是,需要开始向浏览器发送数据时,我们尚无法确定响应的构建是否会完全成功。为避免出现响应创建逻辑出错(比如说,数据库错误或者服务端代码运行失败),我们需要在应用逻辑中创建一种“回滚”已发送响应数据的方式,并向用户展示错误信息。
尽管这肯定有可能做得到(甚至是自动化的),但目前还没有一种通用的方式能够作为协议的一部分。
17d58picg56_1024
因此一般场景是,Web 服务器等待后端数百毫秒以构建页面,而后开始返回数据。这时候我们就碰到了慢启动(译者注:slow start,可参考此文),所以首次 RTT 只能发送大约 14 KB 数据,第二次 28 KB 左右,如此等等。由此我们知道,将 HTML 发送出去,需要用去服务器思考时间加上慢启动时间。在思考时间期间,浏览器对接下来所需的资源一无所知,故也不会针对接下来所需资源的关键路径发送任何请求。
而且,即使我们试着耍小聪明,针对那些资源添加 preload 报头,若我们不提早 flush 文档开头,那还是没有对思考时间加以利用。
现在,将这个与使用 HTTP 推送能做的事情做个对比。服务器可以利用思考时间来推送相关的关键性资源 —— 尤其是 CSS 和 JS。这样一来,当思考时间结束时,我们极有可能已将所有关键性资源都推送给浏览器了。
还有额外好处,这些资源也预热了 TCP 连接,也提升了拥塞窗口,确保思考时间之后的首个 RTT 中,可以使用 28 KB,56 KB,乃至更大的拥塞窗口发送 HTML(这取决于思考时间的长短,以及在此期间我们推送了多少资源)。
一起来看下具体案例:一个 120 KB 的 HTML 页面,关键 CSS 有 24KB,关键 JS 有 74 KB,在 100ms RTT、无限带宽的网络环境下是如何加载的?
没有 HTTP 推送的情况下,生成 HTML 等待了 300ms,接着 4 次 RTT 发送 HTML,因为慢启动的缘故,使用了一个 RTT 请求 JS 和 CSS。在首次渲染之前,时间超过了 800 毫秒。
HTTP 推送
使用 HTTP 推送,CSS 和 JS 会在 HTML 请求到达之后尽快推送出去,发送它们需要 3 个 RTT(又一次因为慢启动),它们将拥塞窗口增大至 128 KB 左右,将要发送 HTML 时,一个 RTT 就能可以了。首次渲染总时间: 400 毫秒。
HTTP 推送
首次渲染加速了 50%!也不算很差嘛。。。

HTTP 推送不尽如意的地方

我认为人们在错误地使用 HTTP 推送的原因之一是,他们在某些并不能提供任何好处甚至损害效率的场景下使用它。

盲目推送静态资源

使用 HTTP 推送可能做的错事之一就是告诉你自己,“啊,这些资源是所有页面都需要的,把它们配置成所有页面都推送”。
这很糟糕,原因是缓存。在访问第一个页面之后,这些资源很可能就在用户的浏览器缓存中,然而你却在闷头推送。你可能会争辩说,这可比内联所有这些资源好多了。是这样的,不错,但,我必须反过来告诉你,内联资源也是糟糕的主意。
所以,若你在以这种方式盲目推送资源,请确保它是你想要内联在页面中的唯一的资源,也就是关键的 CSS。否则,你就是在冒险让重复的请求变慢。
你可能会以为,流重置会帮助推送已缓存的资源去避免浪费带宽和时间。你可能错了。很显然,并非所有浏览器会检查缓存并终止已缓存资源的推送。就算它们会这样,在流重置信号到达服务器之前,还是使用了一整个 RTT 时间发送数据。尤其是有多个资源时,这样做将可能带来大量数据浪费。

将内容放入浏览器缓存

你可能以为,推送会将资源放入浏览器缓存,可以用来做一些像使当前资源失效这样的工作。至少目前不是如此。研讨会上的讨论的话题之一就是现实问题,可能我们需要改变当前的推送行为,支持与浏览器缓存直接交互。不过当前,推送还做不到这些。推送响应进入推送缓存,只有真实请求它们时才会放到 HTTP 缓存中。
因此,如果你在推送资源,希望它们在未来的某个页面中使用,那么浏览器有可能在用到它们之前已经将它们扔出推送缓存之外了。
至少目前的实现是这样的。

填补 HTML 下发之后的管道

247-15022504315kn
通常,在页面的下载循环中,使用的带宽之间会存在间隙。这意味着我们没能尽快下发资源,通常这是因为浏览器发现资源的延迟。
尽管我们应当尽量下发页面所需资源以填满这些间隙,但通常使用预加载比推送更好。预加载将缓存、cookie以及内容协商纳入考虑,它不会像推送那样存在着过度发送或错误发送的风险。就填补这些间隙而言,推送并无任何优势,所有的只是劣势。故最好不要使用推送达成此目的,使用预加载吧。

缓存摘要

从上面我们可以看到,HTTP 推送的一大缺点就是,服务器并不必然清楚浏览器的缓存状态,因此在推送时我们可能会将已在缓存中存在的资源推送出去。
有一个标准扩展的提案,叫做 Cache Digests。其基本思想是浏览器在 HTTP/2 连接初始化之后,向服务器发送摘要,服务器在下发资源之前能够精确判断资源是否已在浏览器缓存中存在。
该提案尚处于早期,可能需要简化,这样实现起来花费更少,不过我敢说,离开这个特性,HTTP 推送只能算半成品。

总结

HTTP 推送可以用来显著提升加载性能。正确使用时能为首个关键路径加载提速,带来性能指标的改善。
推送依然是非常新的技术,像其他所有新工具一样,在找到使用的最优方式之前,还有很长的路要走。这一路多少会有点痛苦。
是故早期实验的初始结果,可能并非全如我们所希望的那样。让我们把那些结果作为标志,指示我们关于推送的使用需要更多聪明才智吧,别妄下结论说它是无用的特性。

本文转载自:http://www.linuxprobe.com/http-pushed.html

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

以下是完整可运行的PPT生成代码,覆盖“PCI手术介入耗材详解”的全部章节(含概述、各耗材系统、辅助装置、术后护理及发展趋势),运行后可直接生成成品PPT,且预留了图片插入位置(可根据需求替换图片路径)。 python from pptx import Presentation from pptx.util import Inches, Pt from pptx.enum.text import PP_ALIGN from pptx.dml.color import RGBColor from pptx.enum.shapes import MSO_SHAPE # 1. 初始化PPT(16:9比例) prs = Presentation() prs.slide_width = Inches(13.33) prs.slide_height = Inches(7.5) bg_color = RGBColor(245, 245, 245) # 浅灰背景,提升可读性 # 通用函数:添加标题和内容框(统一格式) def add_title(slide, title_text): # 标题框 title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.5), Inches(12), Inches(0.8)) title_frame = title_box.text_frame title_frame.text = title_text title_para = title_frame.paragraphs[0] title_para.font.size = Pt(40) title_para.font.bold = True title_para.alignment = PP_ALIGN.CENTER title_para.font.color.rgb = RGBColor(30, 144, 255) # 蓝色标题 def add_content(slide, content_list, start_y=Inches(1.8)): # 内容列表(每行一个要点) for i, content in enumerate(content_list): content_box = slide.shapes.add_textbox(Inches(1), start_y + i * 0.6, Inches(11), Inches(0.5)) content_frame = content_box.text_frame content_frame.text = content content_para = content_frame.paragraphs[0] content_para.font.size = Pt(24) content_para.font.color.rgb = RGBColor(50, 50, 50) # 深灰文字 # 2. 第1页:封面 slide1 = prs.slides.add_slide(prs.slide_layouts[6]) # 空白布局 # 封面标题 title_box1 = slide1.shapes.add_textbox(Inches(2), Inches(2.2), Inches(9), Inches(2)) title_frame1 = title_box1.text_frame title_frame1.text = "PCI手术介入耗材详解" title_para1 = title_frame1.paragraphs[0] title_para1.font.size = Pt(56) title_para1.font.bold = True title_para1.alignment = PP_ALIGN.CENTER title_para1.font.color.rgb = RGBColor(30, 144, 255) # 副标题 sub_box1 = slide1.shapes.add_textbox(Inches(3), Inches(4.2), Inches(7), Inches(1)) sub_frame1 = sub_box1.text_frame sub_frame1.text = "经皮冠状动脉介入治疗(PCI)耗材系统全解析" sub_para1 = sub_frame1.paragraphs[0] sub_para1.font.size = Pt(28) sub_para1.alignment = PP_ALIGN.CENTER sub_para1.font.color.rgb = RGBColor(100, 100, 100) # 3. 第2页:目录 slide2 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide2, "目录") content_list2 = [ "1. PCI手术核心概述", "2. 介入耗材整体分类", "3. 引导与穿刺系统(基础耗材)", "4. 导丝与导管系统(核心传导耗材)", "5. 球囊扩张导管(关键治疗耗材)", "6. 冠状动脉支架(核心植入耗材)", "7. 辅助治疗装置(特殊场景耗材)", "8. 术后护理相关耗材", "9. 耗材技术发展趋势" ] add_content(slide2, content_list2) # 4. 第3页:PCI手术核心概述 slide3 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide3, "1. PCI手术核心概述") # 左侧内容 content_list3 = [ "定义:经皮冠状动脉介入治疗,俗称“冠脉支架手术”", "目的:通过介入手段扩张狭窄/堵塞的冠脉,恢复心肌供血", "适用场景:冠心病、心绞痛、急性心肌梗死等", "核心逻辑:“通路建立→病变处理→器械植入→术后保障”" ] add_content(slide3, content_list3) # 右侧图片占位(可替换为PCI手术示意图) img_box3 = slide3.shapes.add_picture("PCI示意图.jpg", Inches(7.5), Inches(2), width=Inches(4.5), height=Inches(4)) # 若没有图片,可注释上一行,或替换为实际图片路径 # 5. 第4页:介入耗材整体分类 slide4 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide4, "2. 介入耗材整体分类") # 分4类展示(并列布局) # 第一类:引导穿刺类 box4_1 = slide4.shapes.add_textbox(Inches(1), Inches(1.8), Inches(3), Inches(4)) frame4_1 = box4_1.text_frame frame4_1.text = "一、引导穿刺类\n(建立手术通路)\n• 穿刺针\n• 动脉鞘管\n• 导丝(初始)" for para in frame4_1.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 第二类:传导类 box4_2 = slide4.shapes.add_textbox(Inches(4.5), Inches(1.8), Inches(3), Inches(4)) frame4_2 = box4_2.text_frame frame4_2.text = "二、传导类\n(输送治疗器械)\n• 冠脉导丝\n• 指引导管\n• 微导管" for para in frame4_2.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 第三类:治疗类 box4_3 = slide4.shapes.add_textbox(Inches(8), Inches(1.8), Inches(3), Inches(4)) frame4_3 = box4_3.text_frame frame4_3.text = "三、治疗类\n(直接处理病变)\n• 球囊扩张导管\n• 冠脉支架\n• 切割/旋磨球囊" for para in frame4_3.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 第四类:辅助/术后类 box4_4 = slide4.shapes.add_textbox(Inches(11.5), Inches(1.8), Inches(1), Inches(4)) frame4_4 = box4_4.text_frame frame4_4.text = "四、辅助/术后类\n• 血栓抽吸导管\n• 血管闭合器\n• 压迫止血器" for para in frame4_4.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 6. 第5页:引导与穿刺系统 slide5 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide5, "3. 引导与穿刺系统(基础耗材)") # 内容+图片组合 content_list5 = [ "1. 穿刺针:", " - 作用:穿刺动脉(常用桡动脉/股动脉),建立初始入口", " - 特点:细径、锋利针尖,减少血管损伤", "", "2. 动脉鞘管:", " - 作用:穿刺后留置在动脉内,作为后续器械的“通道”", " - 规格:直径5-8F(F=French,1F≈0.33mm),匹配后续导管" ] add_content(slide5, content_list5, start_y=Inches(1.5)) # 图片占位(鞘管示意图) img_box5 = slide5.shapes.add_picture("动脉鞘管示意图.jpg", Inches(7), Inches(3.5), width=Inches(4.5), height=Inches(3)) # 7. 第6页:导丝与导管系统 slide6 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide6, "4. 导丝与导管系统(核心传导耗材)") # 左侧:导丝;右侧:导管 # 导丝内容 box6_1 = slide6.shapes.add_textbox(Inches(1), Inches(1.8), Inches(5), Inches(4.5)) frame6_1 = box6_1.text_frame frame6_1.text = "【冠脉导丝】\n• 核心作用:“引路”——先到达狭窄冠脉病变处,引导后续器械\n• 关键特性:\n - 柔韧性:通过弯曲血管\n - 支撑力:推送球囊/支架\n - 可视性:含显影标记,X光下可见\n• 类型:普通导丝、亲水涂层导丝(复杂病变用)" for para in frame6_1.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 导管内容 box6_2 = slide6.shapes.add_textbox(Inches(7.5), Inches(1.8), Inches(5), Inches(4.5)) frame6_2 = box6_2.text_frame frame6_2.text = "【指引导管】\n• 核心作用:“输送通道”——连接体外与冠脉口,推送球囊/支架\n• 关键特性:\n - 固定性:卡在冠脉开口,防止移位\n - 兼容性:内径匹配球囊/支架尺寸\n• 类型:根据冠脉解剖选型号(如JL、JR系列)" for para in frame6_2.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 图片占位(导丝+导管组合图) img_box6 = slide6.shapes.add_picture("导丝导管组合图.jpg", Inches(4.5), Inches(4.5), width=Inches(4), height=Inches(2)) # 8. 第7页:球囊扩张导管 slide7 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide7, "5. 球囊扩张导管(关键治疗耗材)") content_list7 = [ "核心作用:到达狭窄病变处,充气扩张,撑开狭窄血管壁", "结构组成:", " - 球囊(高分子材料,如尼龙):充气后膨胀,直径2.0-4.0mm", " - 导管杆:连接球囊与体外充气装置", " - 显影标记:定位病变位置", "主要类型:", " - 普通球囊:常规狭窄扩张", " - 切割球囊:钙化严重病变(带微型刀片,切开钙化层)", " - 药物涂层球囊:预防术后再狭窄(球囊带抗增殖药物)" ] add_content(slide7, content_list7) # 图片占位(球囊扩张示意图) img_box7 = slide7.shapes.add_picture("球囊扩张示意图.jpg", Inches(7.5), Inches(3), width=Inches(4.5), height=Inches(3.5)) # 9. 第8页:冠状动脉支架 slide8 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide8, "6. 冠状动脉支架(核心植入耗材)") content_list8 = [ "核心作用:球囊扩张后,植入支架并膨胀,“支撑”血管壁,防止血管回缩", "发展历程:", " 1. 裸金属支架(BMS):早期产品,易发生再狭窄", " 2. 药物涂层支架(DES):目前主流——支架表面涂抗增殖药物(如雷帕霉素),显著降低再狭窄率", "关键特性:", " - 生物相容性:避免血管排斥", " - 径向支撑力:维持血管通畅", " - 可膨胀性:匹配血管直径(2.5-4.0mm常用)" ] add_content(slide8, content_list8) # 图片占位(药物涂层支架结构图) img_box8 = slide8.shapes.add_picture("药物涂层支架图.jpg", Inches(7.5), Inches(3.5), width=Inches(4.5), height=Inches(3)) # 10. 第9页:辅助治疗装置 slide9 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide9, "7. 辅助治疗装置(特殊场景耗材)") # 分3类展示 box9_1 = slide9.shapes.add_textbox(Inches(1), Inches(1.8), Inches(4), Inches(4)) frame9_1 = box9_1.text_frame frame9_1.text = "1. 血栓抽吸导管\n• 适用场景:急性心梗(血管内有血栓)\n• 作用:通过负压抽吸血栓,恢复血流" for para in frame9_1.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) box9_2 = slide9.shapes.add_textbox(Inches(5.5), Inches(1.8), Inches(4), Inches(4)) frame9_2 = box9_2.text_frame frame9_2.text = "2. 旋磨导管\n• 适用场景:严重钙化病变(普通球囊无法撑开)\n• 作用:前端钻石颗粒高速旋转,磨碎钙化斑块" for para in frame9_2.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) box9_3 = slide9.shapes.add_textbox(Inches(10), Inches(1.8), Inches(2.5), Inches(4)) frame9_3 = box9_3.text_frame frame9_3.text = "3. 血管闭合器\n• 适用场景:股动脉穿刺后止血\n• 作用:替代手工压迫,快速止血,减少血肿" for para in frame9_3.paragraphs: para.font.size = Pt(22) para.font.color.rgb = RGBColor(50, 50, 50) # 11. 第10页:术后护理相关耗材 slide10 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide10, "8. 术后护理相关耗材") content_list10 = [ "1. 止血耗材:", " - 压迫止血器(桡动脉穿刺用):弹性压迫,维持止血,可调节松紧", " - 无菌敷料:覆盖穿刺点,预防感染", "", "2. 监测/给药耗材:", " - 静脉留置针:术后输注药物(如抗凝药)", " - 心电监护电极片:监测心率、心律,评估术后心脏功能" ] add_content(slide10, content_list10, start_y=Inches(1.5)) # 图片占位(桡动脉压迫止血器图) img_box10 = slide10.shapes.add_picture("压迫止血器图.jpg", Inches(7.5), Inches(3.5), width=Inches(4.5), height=Inches(3)) # 12. 第11页:发展趋势 slide11 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide11, "9. 耗材技术发展趋势") content_list11 = [ "1. 更小创伤:", " - 小口径鞘管(如4F鞘管):减少穿刺部位并发症,适合外周血管细的患者", "", "2. 生物可吸收支架(BRS):", " - 特点:植入后2-3年逐渐降解,避免终身携带金属支架,恢复血管自然弹性", "", "3. 精准化耗材:", " - 个性化支架:根据患者血管解剖、病变特点定制尺寸/药物涂层", " - 影像引导耗材:结合IVUS(血管内超声),实时评估病变,优化植入效果" ] add_content(slide11, content_list11) # 13. 第12页:总结 slide12 = prs.slides.add_slide(prs.slide_layouts[6]) add_title(slide12, "总结:PCI耗材的“协同作用”") content_list12 = [ "• 核心逻辑:从“通路建立”到“病变治疗”,再到“术后保障”,各耗材环环相扣", "• 关键耗材:导丝(引路)→ 球囊(扩张)→ 支架(支撑),构成治疗核心链", "• 技术方向:向“微创化、可吸收化、精准化”发展,进一步提升PCI安全性和有效性" ] add_content(slide12, content_list12, start_y=Inches(2.5)) # 图片占位(PCI耗材全流程示意图) img_box12 = slide12.shapes.add_textbox(Inches(2), Inches(4.5), Inches(9), Inches(2)) img_frame12 = img_box12.text_frame img_frame12.text = "(此处可插入:PCI耗材全流程示意图)" img_para12 = img_frame12.paragraphs[0] img_para12.font.size = Pt(22) img_para12.alignment = PP_ALIGN.CENTER img_para12.font.color.rgb = RGBColor(150, 150, 150) # 14. 保存PPT文件 prs.save("PCI手术介入耗材详解.pptx") print("PPT生成完成!文件名为:PCI手术介入耗材详解.pptx")   使用步骤: 1. 安装依赖库:打开电脑的“命令提示符(CMD)”或“终端”,输入命令并回车:  pip install python-pptx  2. 准备图片(可选):若有PCI相关示意图(如手术图、耗材图),将图片放在与代码同一文件夹,并重命名为代码中标注的名称(如“PCI示意图.jpg”);若无图片,可直接注释掉含 add_picture 的代码行(不影响文字内容)。 3. 运行代码: - 将上述代码复制到记事本,保存为“generate_pci_ppt.py”(注意后缀是 .py ,不是 .txt ); - 双击运行该 .py 文件,或在终端输入 python generate_pci_ppt.py ,即可生成 PCI手术介入耗材详解.pptx 文件。 生成的PPT包含12页完整内容,文字格式统一、逻辑清晰,可直接在PowerPoint中打开编辑(如修改文字、替换图片、调整配色)。
最新发布
09-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值