新闻详情

新闻详情

首页 / 资讯中心 / 详情

Erlang/OTP 24 弃用清单全解:分布协议强制升级、链接协议演进与函数迁移指南

发布时间:2026/9/25 2:23:57来源:尧图网络
Erlang/OTP 24 弃用清单全解:分布协议强制升级、链接协议演进与函数迁移指南
编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载导读本文以 Erlang/OTP 官方弃用文档system/doc/general_info/deprecations_24.md为骨架系统梳理 OTP 24 中宣布弃用的全部功能包括 Erlang 分布层的大节点容器V4_NC与旧链接协议它们均计划于 OTP 26 强制生效edoc 的?NO_APP宏以及erlang:phash/2与一整组zlib校验/解压函数。文中结合 erl_dist_protocol.md、erlang.erl 与 zlib.erl 源码给出每条弃用项背后的协议细节、替代方案与迁移路径帮助开发者提前规避兼容性风险。OTP 的弃用与移除策略理解时间线的前提要准确理解本文中的每一项弃用声明首先需要掌握 Erlang/OTP 官方的弃用Deprecation与移除Removal策略其完整定义见 system/doc/system_principles/misc.md弃用不等同于立即移除当更优的替代方案出现时旧功能会被标记为弃用除非弃用通知中明确声明了移除计划否则不意味着一定会被移除。弃用会尽早公布弃用功能会尽早写入文档并在发布说明release note中高亮提示在适用情况下编译器会对使用弃用功能的代码发出警告。移除前至少弃用一个版本功能被移除前会被弃用至少一个发布周期并明确预告移除时间。边缘功能风险更高外围、调试trace/debug类功能比语言核心与运行期核心库更容易被移除。仓库中对应的三份文档分别记录了弃用deprecations_head.md、计划移除scheduled_for_removal_head.md与已移除removed_head.md的完整清单。OTP 24 的弃用项正是遵循这一策略宣布的OTP 24 宣布弃用 → OTP 26 强制/移除中间跨越多个发布周期给开发者留出迁移窗口。Erlang 分布大节点容器数据类型的强制化弃用声明OTP 24 宣布不支持大节点容器数据类型large node container data types即 版本 4version 4的 Erlang 分布通信被弃用并计划于 OTP 26 移除。也就是说从 OTP 26 起对大节点容器数据类型的支持将成为强制要求。什么是节点容器数据类型V4_NC节点容器是 Erlang 分布与外部项格式external term format中对pid、port、reference这三种引用类型的统称——它们内部携带创建它们的节点身份信息。历史上这些字段宽度有限限制了单个节点内可创建的进程/端口/引用数量。V4_NCversion 4 node container通过扩展这些字段的位宽打破上限。根据 erl_dist_protocol.md 中DFLAG_V4_NC的权威定义-define(DFLAG_V4_NC, (1 bsl 34)).该标志由对端节点在分布握手handshake时声明表示其接受更大容量的 pid、port 和 reference节点容器类型版本 4具体包括引用类型对应外部项格式扩展内容pidNEW_PID_EXT完整的 32 位ID与Serial字段portV4_PORT_EXT64 位整数referenceNEWER_REFERENCE_EXT最多 5 个 32 位 ID 字该标志在 OTP 24 引入在 OTP 26 成为强制项This flag was introduced in OTP 24 and became mandatory in OTP 26。弃用的影响范围从 OTP 26 起不支持DFLAG_V4_NC的节点将无法与 OTP 节点建立分布连接。更重要的是这一强制要求还波及外部项格式external term formatremoved_26.md 明确指出OTP 26 的强制化also includes external term format produced byterm_to_binary()/term_to_iovec()。这意味着分布式节点间通过term_to_binary()/term_to_iovec()生成的二进制数据其承载 pid/port/reference 的部分也会采用新的 v4 编码任何自行实现 Erlang 分布协议或解析外部项格式的第三方实现例如其他语言编写的分布节点、网关、序列化库必须在 OTP 26 之前跟进 v4 节点容器编码否则将无法与新版 OTP 节点互操作。Erlang 分布旧链接协议的弃用与强制替换弃用声明OTP 24 同时宣布用于 Erlang 分布通信的**旧链接协议old link protocol**被弃用支持将于 OTP 26 移除。从 OTP 26 起新链接协议将成为强制要求——Erlang 节点将拒绝与未实现新链接协议的节点建立连接。弃用文档特别强调了一个重要的工程动机旧协议可能导致链接link进入不一致状态the old protocol can cause links to enter an inconsistent state。因此即使是自行实现 Erlang 分布的开发者也被明确鼓励尽早实现新链接协议而不是等到强制日期临近。新旧链接协议的差异从信号层面理解在 erl_dist_protocol.md 的 Link Protocol 一节中新链接协议OTP 23.3 引入OTP 26 强制的技术细节如下新协议引入了两个新信号替换了旧协议中的UNLINK信号信号方向与作用LINK建立链接时由发起方进程发送给目标进程新旧协议均使用但新协议下接收后的处理方式不同UNLINK_ID解除链接时由发起方发送给被链接进程携带唯一IdUNLINK_ID_ACK被链接进程收到UNLINK_ID后必须回送的确认信号且必须先于发送给发起方的任何其他信号发出其Id必须与所确认的UNLINK_ID一致UNLINK_ID/UNLINK_ID_ACK这种请求—确认机制与 Erlang 的信号顺序保证signal ordering guarantee配合使得UNLINK_ID的发送方能够明确推断其他信号的相对顺序——这正是旧协议所缺失的、导致链接状态不一致的根源。新协议还要求进程维护进程本地的链接信息每条链接包含目标Pid、Active标志等状态并据此决定调用link/1、unlink/1时是否真正发送信号仅当进程本地信息表明两进程间尚不存在活动链接时才发送LINK信号仅当本地信息表明存在活动链接时才发送UNLINK_ID信号。握手层面的强制机制DFLAG_UNLINK_ID新链接协议在分布握手时通过DFLAG_UNLINK_ID分布标志声明支持-define(DFLAG_UNLINK_ID, 16#2000000).erl_dist_protocol.md 中对该标志的注释明确写道This flag is mandatory as of OTP 26.——从 OTP 26 起OTP 节点会拒绝与未在握手时设置DFLAG_UNLINK_ID的节点连接。这与弃用文档中Erlang nodes will then refuse to connect to nodes not implementing the new link protocol的描述完全一致。edoc 的 ?NO_APP 宏弃用OTP 24 还弃用了 edoc 包含文件edoc_doclet.hrl中的?NO_APP宏。该宏的定义位于 lib/edoc/include/edoc_doclet.hrl-define(NO_APP, no_app).在 OTP 24 之前的版本中edoc_doclet.hrl通过该宏提供一个表示不属于任何应用的默认模块属性值。OTP 24 起该宏被弃用使用 edoc 自定义 doclet 的开发者应在生成 edoc 相关代码时避免依赖?NO_APP改用显式的应用名或新的 edoc 属性机制。OTP 24 弃用的函数完整清单与迁移对照OTP 24 弃用了 12 个函数集中在erlang:phash/2与zlib模块的校验和、缓冲区管理与流式解压 API。下表完整列出弃用项、替代方案并标注当前仓库源码中的证据位置弃用函数替代方案源码证据erlang:phash/2erlang:phash2/2erlang.erlzlib:adler32/2erlang:adler32/1zlib.erlzlib:adler32/3erlang:adler32/2zlib.erlzlib:adler32_combine/4erlang:adler_combine/3zlib.erlzlib:crc32/1erlang:crc32/1作用于未压缩数据zlib.erlzlib:crc32/2erlang:crc32/1zlib.erlzlib:crc32/3erlang:crc32/2zlib.erlzlib:crc32_combine/4erlang:crc32_combine/3zlib.erlzlib:getBufSize/1无替代文档注明将在未来版本移除zlib.erlzlib:inflateChunk/1zlib:safeInflate/2zlib.erlzlib:inflateChunk/2zlib:safeInflate/2zlib.erlzlib:setBufSize/2无替代文档注明将在未来版本移除zlib.erlerlang:phash/2 → erlang:phash2/2erlang:phash/2是自 ERTS 4.9.1.1 起提供的可移植哈希函数返回Term在1..Range范围内的哈希值Range最大为 2^32。在 erlang.erl 中其文档以 warning 形式明确标注弃用原因This function is deprecated aserlang:phash2/2should be used for new code. Note thaterlang:phash(X,N)isnot necessary equal toerlang:phash2(X,N).这段源码注释揭示了一个关键迁移陷阱phash/2与phash2/2对同一输入的哈希值并不保证一致。因此如果代码中存在持久化存储的哈希值、依赖特定哈希分布的算法如一致性哈希、布隆过滤器、分布式分片迁移时不能简单替换函数名而应重新计算并评估哈希值变化对系统的整体影响。erlang:phash2/2的语义见 erlang.erl是对同一 Erlang 项返回的哈希值跨机器架构与 ERTS 版本保持稳定且结果位于0..Range-1范围内注意与phash/2的1..Range区间不同。zlib 校验和函数 → erlang 内建 BIFzlib:adler32*与zlib:crc32*系列在 OTP 24 被弃用原因是这些校验和计算本质上是纯数据运算不应依赖zlib的流式状态机且erlang模块提供了语义相同、无需打开 zlib 流的内建 BIF旧调用新调用zlib:adler32(Z, Data)erlang:adler32(Data)zlib:adler32(Z, Adler, Data)erlang:adler32(Data, Adler)zlib:adler32_combine(Z, Adler1, Adler2, Size2)erlang:adler_combine(Adler1, Adler2, Size2)zlib:crc32(Z, Data)erlang:crc32(Data)zlib:crc32(Z, Crc, Data)erlang:crc32(Data, Crc)zlib:crc32_combine(Z, Crc1, Crc2, Size2)erlang:crc32_combine(Crc1, Crc2, Size2)注意zlib:crc32/1的替代说明中有on the uncompressed data这一限定——它作用于未压缩数据的校验与 zlib 流中基于压缩数据的校验场景不同迁移时需确认计算对象的一致性。zlib 流式解压inflateChunk → safeInflatezlib:inflateChunk/1、zlib:inflateChunk/2被弃用统一由zlib:safeInflate/2替代。两者的关键差异在于 API 的返回值契约inflateChunk在需要字典dictionary时返回{need_dictionary, Output}调用者需自行管理这种带副作用的返回值safeInflate/2返回{need_dictionary, Adler, Output}或解压完成的结果将 Adler-32 校验值显式纳入返回值见 zlib.erl 的类型注释。在 zlib.erl 的导出列表中safeInflate/2已是当前正式导出的 API其内部基于 zlib NIF 实现inflate_nif/4等见 zlib.erl可安全地用于流式解压场景如解压zlib:open/0打开的流。getBufSize/1与setBufSize/2则没有替代函数文档明确它们将在未来版本移除。OTP 26 的移除确认弃用声明的最终落地弃用声明的兑现可以对照 removed_26.md 验证。OTP 26 中分布层两项弃用已正式转为强制/移除无大节点容器支持OTP 26 起DFLAG_V4_NC强制外部项格式同步升级removed_26.md旧链接协议OTP 26 起新链接协议强制未实现者将被拒绝连接removed_26.md。该文档还列出了 OTP 26 一并移除的其他功能如code:is_module_native/1、code:rehash/0、disk_log:accessible_logs/0、ftp:start_service/1等可作为升级 OTP 26 时的完整排查清单。从当前仓库OTP_VERSION 为30.0-rc0的源码看上述 zlib 函数在 zlib.erl 中已被标记为-removed而非仅-deprecatederlang:phash/2仍标记为-deprecatederlang.erl。可以推断zlib 校验/缓冲区系列函数在后续版本中已被正式移除仍在使用它们的代码在最新 OTP 上会直接编译失败——迁移窗口已经关闭必须尽快切换到erlang内建 BIF 与safeInflate/2。迁移实操建议基于 OTP 24 弃用项与 OTP 26 的强制化建议按以下优先级开展迁移分布协议层最高优先级如果运维或自建了非 OTP 实现的 Erlang 分布节点、网桥或外部项格式解析器立即对照 erl_dist_protocol.md 与 erl_dist_protocol.md 实现DFLAG_V4_NC握手标志1 bsl 34与DFLAG_UNLINK_ID握手标志16#2000000的声明以及UNLINK_ID/UNLINK_ID_ACK信号处理逻辑校验和代码全局替换zlib:adler32*、zlib:crc32*为erlang内建 BIF注意参数顺序与未压缩数据语义差异替换inflateChunk为safeInflate/2适配其{need_dictionary, Adler, Output}返回值哈希代码phash/2→phash2/2时重点审查是否存在持久化或依赖哈希分布的算法必要时重新计算存量哈希值编译期排查对弃用函数编译器和 Dialyzer 会给出提示可运行erlc观察警告对已移除函数当前 OTP 30 源码中的-removed项直接搜索zlib:getBufSize、zlib:setBufSize、zlib:inflateChunk等调用点逐一清理跟踪官方清单持续对照 deprecations_head.md、scheduled_for_removal_head.md 与 removed_head.md 三份主清单提前规划下个版本的兼容工作。参考文档与源码索引弃用主清单system/doc/general_info/deprecations_head.mdOTP 24 弃用原始声明system/doc/general_info/deprecations_24.mdOTP 26 移除清单system/doc/general_info/removed_26.md弃用/移除策略system/doc/system_principles/misc.md分布协议与握手标志定义erts/doc/guides/erl_dist_protocol.md、链接协议信号细节?NO_APP宏定义lib/edoc/include/edoc_doclet.hrlphash/2弃用标记与文档erts/preloaded/src/erlang.erl、phash 文档段落zlib 弃用/移除标记与safeInflate/2erts/preloaded/src/zlib.erl、safeInflate 导出与实现赞分享编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载相关推荐Erlang/OTP 26 移除功能清单与迁移指南分布协议变更、链接协议强制及废弃 API 替代方案Erlang/OTP 26 移除功能清单与迁移指南分布协议变更、链接协议强制及废弃 API 替代方案 本文基于 Erlang/OTP 官方移除文档 syst编程语言语言运行时标准库编译器并发编程Erlang/OTP 30 移除计划详解Guard 类型测试别名、分布式协议与加密组件弃用清单Erlang/OTP 30 移除计划详解Guard 类型测试别名、分布式协议与加密组件弃用清单 本指南基于 Erlang/OTP 仓库中的 OTP 30 计划编程语言语言运行时标准库编译器并发编程网盘直链解析下载指南八大平台一个脚本轻松搞定网盘直链解析下载指南八大平台一个脚本轻松搞定 网盘直链下载助手是一个基于 JavaScript 的网盘直链解析脚本覆盖百度网盘、阿里云盘、中国移动云盘等八大编程语言语言运行时标准库编译器并发编程上一篇开源项目教程FAANG编码面试问题汇总下一篇终极指南三分钟快速上手abogen有声书制作工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CCS烧录程序原理与TI C2000 DSP烧录失败排查指南 2026/9/25 2:58:54

CCS烧录程序原理与TI C2000 DSP烧录失败排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ETH多链密钥碰撞工具V2.01:私钥找回的原理与实战 2026/9/25 2:58:48

ETH多链密钥碰撞工具V2.01:私钥找回的原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
OctoPrint JS 客户端库 Timelapse 模块实战:用 OctoPrintClient.timelapse 管理延时摄影的完整指南 2026/9/25 2:58:42

OctoPrint JS 客户端库 Timelapse 模块实战:用 OctoPrintClient.timelapse 管理延时摄影的完整指南

物联网后端 【免费下载链接】OctoPrint OctoPrint is the snappy web interface for your 3D printer! 项目地址: https://gitcode.com/gh_mirrors/oc/OctoPrint 点击查看 免费下载 本文是 OctoPrint JavaScript 客户端库(OctoPrintClient)系…

阅读更多 →
Sliver 仓库中的 xxhash 包:XXH64 高性能哈希在 Go 与 Zstd 压缩中的实战解析 2026/9/25 2:58:42

Sliver 仓库中的 xxhash 包:XXH64 高性能哈希在 Go 与 Zstd 压缩中的实战解析

网络安全 【免费下载链接】sliver Adversary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/sl/sliver 点击查看 免费下载 本指南聚焦当前仓库中 vendored 的 xxhash 包(位于 vendor/github.com/klauspost/compress/zstd/internal/xxh…

阅读更多 →
FAST 色彩工具链 matchLightnessIndex 解析:基于 HSL 明度索引匹配的颜色定位方法 2026/9/25 2:58:36

FAST 色彩工具链 matchLightnessIndex 解析:基于 HSL 明度索引匹配的颜色定位方法

前端UI组件 【免费下载链接】fast The adaptive interface system for modern web experiences. 项目地址: https://gitcode.com/gh_mirrors/fa/fast 点击查看 免费下载 导读 matchLightnessIndex() 是 FAST 设计系统色彩工具库 microsoft/fast-colors 提供的一个…

阅读更多 →
SOEM不是黑盒:实时以太网主站状态机原理与RK3568移植实战 2026/9/25 2:58:36

SOEM不是黑盒:实时以太网主站状态机原理与RK3568移植实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉