拓冰建站拓冰建站
首页 / 资讯中心 / 正文

fluent-bit 内嵌 nghttp2 1.65.0 中的 nghttp2_stream_get_weight:RFC 7540 流优先级 API 的废弃现状与源码级解读

fluent-bit 内嵌 nghttp2 1.65.0 中的 nghttp2_stream_get_weightRFC 7540 流优先级 API 的废弃现状与源码级解读【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit本文基于 fluent-bit 仓库内嵌vendored的 nghttp2 1.65.0 库中nghttp2_stream_get_weight的官方 API 文档展开结合该函数的真实源码实现、废弃声明与 RFC 9218 替代方案帮助读者准确理解这个恒定返回默认权重的桩函数为何存在、它的整族 API 现状如何以及在新代码中应如何迁移到可扩充优先级extensible prioritization机制。1. 文档定位这是一个单函数 API 参考页fluent-bit 将 nghttp2 以子树形式内嵌在 lib/nghttp2-1.65.0/ 中作为 HTTP/2 支持的基础依赖。nghttp2 的文档目录 lib/nghttp2-1.65.0/doc/ 采用一个函数一个.rst页面的组织方式本节的主体文档就是 nghttp2_stream_get_weight.rst。该文档给出的原型Synopsis信息如下#include nghttp2/nghttp2.h int32_t nghttp2_stream_get_weight(nghttp2_stream *stream);文档正文只有两条关键事实但信息量很大废弃警告RFC 7540的流优先级priorities机制已被RFC 9113HTTP/2 修订版标记为废弃官方建议迁移到RFC 9218定义的可扩充优先级extensible prioritization方案当前行为该函数始终返回宏NGHTTP2_DEFAULT_WEIGHT入参stream被完全忽略。也就是说这个函数在 nghttp2 1.65.0 中已经不再承载任何真实的优先级查询能力它只是为了保持 C ABI 兼容而保留的占位实现。2. 源码印证一个恒定返回 16 的桩函数打开实现文件 lib/nghttp2-1.65.0/lib/nghttp2_stream.c可以看到与文档描述完全一致的极简实现int32_t nghttp2_stream_get_weight(nghttp2_stream *stream) { (void)stream; return NGHTTP2_DEFAULT_WEIGHT; }三个要点值得注意(void)stream;显式丢弃入参表明函数不读取stream的任何字段。这意味着 RFC 7540 时代流依赖树stream dependency tree 权重weight的内部数据模型在该版本中已被整体移除而不是某些状态下返回权重返回值是编译期常量NGHTTP2_DEFAULT_WEIGHT。该宏在公共头文件 lib/nghttp2-1.65.0/lib/includes/nghttp2/nghttp2.h 中定义#define NGHTTP2_DEFAULT_WEIGHT 16即调用者无论传入哪个流拿到的都是16—— 这正是 RFC 7540 时代规定的默认流权重值保留该值是为了让旧代码在链接和运行层面无感退化函数声明处的 Doxygen 注释块nghttp2.h 第 67716782 行与.rst文档逐字一致同样带有Deprecated... Consider migrating to RFC 9218的警告说明废弃语义是官方有意、统一地在头文件和文档中双份声明的。测试代码也能反向印证这个常量语义lib/nghttp2-1.65.0/tests/nghttp2_frame_test.c 第 133 行断言默认pri_spec的weight等于NGHTTP2_DEFAULT_WEIGHT而 lib/nghttp2-1.65.0/lib/nghttp2_priority_spec.c 中nghttp2_priority_spec_default_init()也将weight初始化为该宏对应文档页 nghttp2_priority_spec_default_init.rst 描述的默认值组合stream_id 0、weight NGHTTP2_DEFAULT_WEIGHT、exclusive 0。3. 废弃背景RFC 7540 优先级为何整体退场文档中的 warning 指明了协议演进脉络RFC 7540HTTP/2 原始规范定义了PRIORITY帧、流依赖树和weight1~256默认 16等机制RFC 9113HTTP/2 修订版将其废弃。原因是流依赖树在实际部署中暴露出流饥饿、实现复杂度高、头部阻塞缓解有限等问题主流浏览器与代理生态最终放弃了PRIORITY帧的使用RFC 9218定义了可扩充优先级方案基于:priority伪头部与SETTINGS_PRIORITY_PARAMS允许以可插拔参数的方式表达优先级作为替代路径。nghttp2 库在 2025 年 1 月的变更中响应了这一协议演进。lib/nghttp2-1.65.0/ChangeLog 中记录了 Remove RFC 7540 prioritiesPull Request #22872025-01-10 合入这一提交并逐条列出了公共 API 的行为变化。这份清单是理解整个桩化过程最权威的一手材料。4. 被桩化的 API 家族一张总表nghttp2_stream_get_weight并不是被废弃的孤例。根据 ChangeLog 的官方总结与 lib/nghttp2-1.65.0/lib/nghttp2_stream.c 中的实现RFC 7540 优先级相关的公开 API 在 1.65.0 中的现状如下API1.65.0 中的行为依据nghttp2_stream_get_weight(stream)恒返回NGHTTP2_DEFAULT_WEIGHT16nghttp2_stream.cnghttp2_stream_get_parent(stream)恒返回NULLnghttp2_stream.cnghttp2_stream_get_next_sibling(stream)恒返回NULLnghttp2_stream.cnghttp2_stream_get_previous_sibling(stream)恒返回NULLnghttp2_stream.cnghttp2_stream_get_first_child(stream)恒返回NULLnghttp2_stream.cnghttp2_stream_get_sum_dependency_weight(stream)恒返回0nghttp2_stream.cnghttp2_submit_priority(...)no-op恒返回0nghttp2_submit_priority.rstnghttp2_session_change_stream_priority(...)no-op恒返回0ChangeLognghttp2_session_create_idle_stream(...)no-op恒返回0ChangeLognghttp2_submit_request/submit_request2/submit_headers的pri_spec参数被忽略ChangeLog同时ChangeLog 还记录了服务器侧选项nghttp2_option_set_server_fallback_rfc7540_priorities的废弃。可以推断该版本中所有围绕nghttp2_priority_spec依赖父流 ID weight exclusive 位的数据通路都已被切断结构体与初始化函数仍保留以便旧代码通过编译但不再影响任何帧的生成与调度。对开发者的实际含义是不要依赖上表任何 API 的返回值来做逻辑判断。例如用nghttp2_stream_get_weight判断流是否高优先级这类旧写法在 1.65.0 上会永远得到 16行为静默失效且没有任何运行时告警。5. 迁移方向RFC 9218 可扩充优先级 API废弃警告中给出的替代方案是 RFC 9218。nghttp2 1.65.0 已提供对应的公开接口文档页均可在 lib/nghttp2-1.65.0/doc/ 中查到nghttp2_session_change_extpri_stream_priority.rst修改指定流的可扩充优先级参数nghttp2_session_get_extpri_stream_priority.rst读取指定流当前的可扩充优先级设置nghttp2_extpri_parse_priority.rst解析 RFC 9218 的优先级参数字符串如u3,m这类:priority伪头部取值。与旧 API 的对应关系可以粗略概括为旧接口面向依赖树 权重这一特定模型新接口面向一组可扩展的优先级参数调用方通过 session 级接口按流 ID 操作而不再直接操作nghttp2_stream指针上的依赖树遍历函数get_parent/get_first_child等。一个简单的对比示例说明新旧写法在代码层面的差异/* 旧写法RFC 7540在 nghttp2 1.65.0 上恒等于 16逻辑失效 */ #include nghttp2/nghttp2.h int32_t weight nghttp2_stream_get_weight(stream); /* 新方向RFC 9218通过 session 接口读写可扩充优先级参数 */ /* 具体签名与取值以 * lib/nghttp2-1.65.0/doc/nghttp2_session_change_extpri_stream_priority.rst * 与 * lib/nghttp2-1.65.0/doc/nghttp2_session_get_extpri_stream_priority.rst * 中的文档为准 */6. 与 fluent-bit 的关系fluent-bit 的 HTTP/2 客户端支持构建在lib/nghttp2-1.65.0之上核心实现在 src/flb_http_client_http2.c。从源码中搜索pri_spec、priority等关键字未在该文件中发现对 RFC 7540 优先级相关 API包括nghttp2_stream_get_weight、nghttp2_submit_priority、nghttp2_session_change_stream_priority的调用。可以推断fluent-bit 的 HTTP/2 输出链路并不依赖流优先级功能因此本次 nghttp2 上游的优先级桩化对 fluent-bit 的行为没有实际影响了解该 API 现状主要服务于以下场景阅读 nghttp2 源码时遇到这组恒返常量/NULL的函数能立刻识别其为废弃桩实现而非 bug基于 fluent-bit 内嵌的 nghttp2 做二次开发如自定义 HTTP/2 插件时避免误用废弃 API优先评估 RFC 9218 接口。7. 关键路径速查内容路径本文主体 API 文档lib/nghttp2-1.65.0/doc/nghttp2_stream_get_weight.rst函数实现恒返回 16lib/nghttp2-1.65.0/lib/nghttp2_stream.c声明与废弃注释lib/nghttp2-1.65.0/lib/includes/nghttp2/nghttp2.hNGHTTP2_DEFAULT_WEIGHT宏16lib/nghttp2-1.65.0/lib/includes/nghttp2/nghttp2.hRFC 7540 优先级移除的官方行为清单lib/nghttp2-1.65.0/ChangeLogNGHTTP2_DEFAULT_WEIGHT宏文档lib/nghttp2-1.65.0/doc/macros.rst废弃的nghttp2_submit_priority文档lib/nghttp2-1.65.0/doc/nghttp2_submit_priority.rstRFC 9218 可扩充优先级 API 文档lib/nghttp2-1.65.0/doc/ 下的nghttp2_session_change_extpri_stream_priority.rst等页面结论在 nghttp2 1.65.0fluent-bit 当前内嵌版本中nghttp2_stream_get_weight是一个为 ABI 兼容而保留的废弃桩函数恒返回默认权重 16RFC 7540 优先级整族 API 已全部退化为 no-op 或常量返回。需要表达流优先级的新代码应转向 RFC 9218 可扩充优先级接口fluent-bit 自身的 HTTP/2 客户端则完全不使用这套废弃 API。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门