WuKongIM 动态数据节点生产就绪(Stage 9):持久化健康新鲜度、fail-closed 放置门禁与真实流量生命周期验证
即时通讯后端【免费下载链接】WuKongIMMore than just IM 不只是即时通讯(IM)项目地址https://gitcode.com/gh_mirrors/wu/WuKongIM点击查看免费下载在 WuKongIM 的动态节点生命周期体系中Stage 9 解决的是“功能可用”与“生产可运维”之间的最后一道鸿沟为动态加入/移除的数据节点引入持久化、低频、可计算新鲜度的健康上报回路让 Slot/Channel 放置与缩容移除在健康证据陈旧或缺失时 fail closed默认失败并通过 Prometheus 指标与 manager JSON 字段向运维者解释每一次拒绝的原因最后用一条真实 WKProto 流量的生命周期冒烟证明整套流程可以在业务不断流的前提下完成“加入—激活—onboard—排空—移除”。读完本文你可以掌握健康新鲜度模型fresh/stale/missing、放置谓词NodeSchedulableForPlacement的判定条件、缩容健康阻断字段的完整清单、低基数指标契约以及四条分阶段门禁Gate 9A–9D的验证命令。1. 背景为什么需要“持久的健康新鲜度回路”Stage 9 之前的 Stage 1–8 已经让动态数据节点生命周期“功能完备且经过故障演练”seed join、激活、Slot onboarding、scale-in 准备、安全移除、真实 e2e 覆盖以及基于 gofail 的 join/onboarding/scale-in 故障恢复均已覆盖见 Stage 9 设计文档。动态节点设计从一开始就把**成员关系membership与健康health**刻意分离成员关系回答“节点是否属于集群”joining - active - leaving - removed健康回答“节点当前是否可用、且该证据是否新鲜”上报状态alive | suspect | down新鲜度fresh | stale | missing有效健康alive | suspect | down | unknownunknown是派生状态而非直接上报无报告、报告超过 TTL、报告属于旧 epoch、或报告对当前操作不可信时节点被视为unknown问题在于Stage 9 之前的ReportNode/ReportSlots只是 best-effort尽力而为没有定义持久的新鲜度契约一个节点可以是持久化的active成员但它的运行时状态可能已经陈旧、未知或不可达。因此新增Slot/Channel放置无法安全地消费健康证据没有新鲜度、TTL 与 fail-closed 语义manager 与 Prometheus 缺少完整的低基数视图来展示动态节点就绪度、健康新鲜度、生命周期尝试次数、任务阻断与移除阻断原因没有一条组合了“动态加入、onboarding、缩容、移除 客户端持续连接发送”的真实流量就绪演练。Stage 9 的目标是让这个区分显式化且可观测新鲜健康可以解锁放置与安全校验陈旧或未知健康一律 fail closed。2. Stage 9 总体架构四个有序子阶段Stage 9 主实施计划 把整个阶段拆成四个有序子计划使每一块都可以独立测试、独立评审顺序子阶段计划文档解锁的能力9AHealth Report ModelStage 9A 计划持久化低频健康报告、新鲜度计算、控制快照字段9BHealth-Gated Placement And RemoveStage 9B 计划新放置排除陈旧/未知节点scale-in/remove 报告健康阻断9CObservability And Manager EvidenceStage 9C 计划Prometheus 与 manager 暴露生命周期就绪度、健康年龄与阻断证据9DReal Traffic Production SmokeStage 9D 计划在公共面证明 join、onboarding、scale-in、remove 在流量持续时可用主计划同时给出总控文档链路Stage 9 设计文档、动态节点生命周期总计划。路径对应说明计划文档写作时使用的包名为pkg/controllerv2、pkg/clusterv2、internalv2、test/e2ev2、cmd/wukongimv2。从源码结构看当前仓库中对应实现已分别位于 pkg/controller、pkg/cluster、internal/access/manager、test/e2e/cluster 与 cmd/wukongim 下本文引用当前仓库中实际存在的文件路径。3. 跨阶段不变量Cross-Stage Invariants主计划为四个子阶段设定了必须全程保持的不变量它们是 Stage 9 正确性的“宪法”任何子阶段的实现都不能违反健康报告是持久的、低频的但绝不允许让放置/生命周期的 compare-and-set 操作与心跳抖动heartbeat churn竞争Controller当前仓库中即pkg/controller的成员关系是唯一权威authoritative。Manager 与 metrics只读健康证据不拥有持久化健康事实一个节点可调度当且仅当data 角色 active成员 新鲜的alive健康 runtime_readytruejoining、leaving、removed、suspect、down、stale、missing-health 的节点对新的 Slot/Channel 放置必须 fail closedscale-in/remove 必须用显式字段与有界原因解释健康陈旧或缺失指标标签保持低基数禁止UID、channel ID、task ID、session ID、地址标签test/e2e原 e2ev2下的测试保持黑盒只使用公共 manager HTTP、公共 metrics、WKProto 与进程句柄。4. Stage 9A持久化健康报告模型4.1 每节点一份有界健康报告Stage 9A 的核心是在集群状态中为每个节点存储一份紧凑的NodeHealthReport并带领导者侧报告时间戳与有界载荷字段。当前仓库中的实际定义pkg/controller/state/types.go// NodeHealthReport stores one bounded low-frequency runtime health report. type NodeHealthReport struct { // NodeID is the reporting node identity. NodeID uint64 json:node_id // Status is the reported runtime health status. Status NodeStatus json:status // RuntimeReady reports whether the node can serve foreground cluster traffic. RuntimeReady bool json:runtime_ready // ObservedControlRevision is the latest logical Controller revision observed by the node. ObservedControlRevision uint64 json:observed_control_revision // ObservedSlotRevision is the latest local Slot runtime revision observed by the node. ObservedSlotRevision uint64 json:observed_slot_revision,omitempty // ReportSeq is a node-local sequence used for diagnostics. ReportSeq uint64 json:report_seq // ReportedAtUnixMilli is filled by the Controller leader when the report is proposed. ReportedAtUnixMilli int64 json:reported_at_unix_milli // AppliedRaftIndex is the Controller Raft index that stored this report. AppliedRaftIndex uint64 json:applied_raft_index,omitempty // ErrorCode is a bounded machine-readable runtime reason. ErrorCode string json:error_code,omitempty }存储约束见 设计文档第 5 节记录必须有界不得包含 per-channel、per-UID、per-session 细节ErrorCode长度上限 128 字符ClusterState上以NodeHealthReports []NodeHealthReport字段保存每节点一份报告types.go。4.2 关键设计健康写不推进逻辑 Revision这是 9A 最重要的机制决策。健康报告不得走会递增ClusterState.Revision的普通变更路径而是更新ClusterState.NodeHealthReports更新AppliedRaftIndex与校验和checksum返回ApplyResult{Updated: true}保持ClusterState.Revision不变通过校验和变化发布快照。这样既让健康报告持久化、可见又保证既有生命周期/任务的 CAScompare-and-set围栏不受心跳类高频写入干扰。当前仓库源码印证了这套语义命令种类 KindReportNodeHealth report_node_health命令体携带NodeHealth *state.NodeHealthReportfsm.ApplyResult 明确区分三个位Changed推进逻辑 revision、Updated“命令改变了持久化状态但没有推进逻辑集群状态 revision”、Noop幂等/过期FSM 测试fsm_test.go证明第一条健康报告Updatedtrue Changedfalse且 Revision 不变重复提交相同报告则落到Noop结果——即写入幂等且单调不推进也不会回退更新报告的ReportSeq与新鲜度。4.3 上报节奏、TTL 与配置项设计文档给出的节奏参数与当前实现一致默认上报间隔5 秒默认 TTL30 秒本地就绪状态变化时实际可行情况下立即上报仅当抑制仍能在 TTL 过期前保证一次新鲜心跳时才允许抑制未变化的周期性报告报告写入按(node_id, report_seq)幂等单调时间戳在 Controller 领导者侧评估避免信任远端时钟做新鲜度判断。配置模型在 pkg/cluster/config.go// HealthReportConfig controls low-frequency node health reporting to Controller. type HealthReportConfig struct { // Interval controls how often a node reports compact health evidence. Interval time.Duration // TTL bounds how long the control plane may trust the latest report. TTL time.Duration }默认值与校验config.go、#L633-L635Interval0归一为 5s、TTL0归一为 30s校验规则为Interval 0 || TTL 0 || TTL Interval时返回ErrInvalidConfig——TTL 必须不小于 Interval。配置暴露面cmd/wukongim 的 TOML 示例 中为cluster.node_health_report_interval 5s、cluster.node_health_report_ttl 30s环境变量名为WK_CLUSTER_NODE_HEALTH_REPORT_INTERVAL与WK_CLUSTER_NODE_HEALTH_REPORT_TTL见 internal/config/schema.go。4.4 节点侧低频上报回路每个数据节点在启动后运行一个独立的低频健康上报 goroutine停止时先停健康回路、且有有界的单次上报超时。从源码结构看pkg/cluster中的startHealthReportLoop/reportNodeHealth/runtimeReadyForHealthReport由一组专门的测试验证node_health_report_test.goTestHealthReportLoopUsesBoundedReportContext控制器阻塞时Stop 必须在有界时间内让 ReportNode 的 context 以context.DeadlineExceeded结束——即单次上报有超时预算成功上报会刷新channelDataPlaneLease的lastVisibleAt且该可见时间不晚于上报开始时间上报失败则不刷新租约节点stopping期间runtimeReadyForHealthReport()返回 false停止流程还会发出“最后一条 not-ready 健康报告”并尊重 Stop 的取消。这意味着健康回路本身遵循第 11 节性能约束不在 SEND/append/fetch 等热路径上同步等待也不引入绕过集群语义的单节点捷径。5. 健康新鲜度映射与放置门禁Stage 9B5.1 fresh / stale / missing 的判定Controller 健康报告进入控制快照control snapshot读模型时由BuildNodeHealth完成映射pkg/cluster/control/snapshot.go无报告existsfalse→NodeHealthMissingReportedAtUnixMilli早于当前时间时钟偏差保护→NodeHealthStalettl 0 || age ttl→NodeHealthStale否则 →NodeHealthFresh。NodeHealth读模型字段完整保留决策所需证据Status、Freshness、RuntimeReady、ObservedControlRevision、ObservedSlotRevision、ReportSeq、ReportedAt、ReportAge、ReportTTL、ErrorCodesnapshot.go。5.2 共享放置谓词NodeSchedulableForPlacementStage 9B 把“可调度”收敛为一个共享谓词替代各处重复的 active-data 过滤当前实现snapshot.go// NodeSchedulableForPlacement reports whether a node can receive new data placement. // A schedulable node must be>GOWORKoff go test ./pkg/controllerv2/state ./pkg/controllerv2/fsm ./pkg/controllerv2 ./pkg/clusterv2/control ./pkg/clusterv2/observe ./pkg/clusterv2 -run Health|ReportNode|ControlWrite|Config -count1 GOWORKoff go test ./cmd/wukongimv2 -run Config|HealthReport -count1 git diff --check期望健康报告命令持久化报告数据并推进 applied index而周期性“仅健康”写入不改变逻辑 placement/lifecycle revision。Gate 9B放置与移除对陈旧/缺失健康 fail closedGOWORKoff go test ./pkg/clusterv2 ./internalv2/usecase/management ./internalv2/access/manager -run Health|Placement|ScaleIn|Remove|NodeList -count1 git diff --check期望没有新鲜alive健康的 active 数据节点被排除出新放置manager scale-in 状态暴露健康阻断。Gate 9C运维证据可见且低基数GOWORKoff go test ./pkg/metrics ./internalv2/usecase/management ./internalv2/access/manager ./internalv2/app -run Lifecycle|Health|Metrics|Manager|ScaleIn -count1 git diff --check期望Prometheus 指标族与 manager JSON 字段暴露生命周期与健康新鲜度且无高基数标签。Gate 9D公共真实流量生命周期冒烟通过GOWORKoff go test -tagse2e ./test/e2ev2/cluster/dynamic_node_readiness -run TestDynamicNodeLifecycleWithContinuousTraffic -count1 -timeout 12m -p1 GOWORKoff go test -tagse2e ./test/e2ev2/cluster/dynamic_node_join ./test/e2ev2/cluster/dynamic_node_readiness -count1 -timeout 15m -p1 git diff --check期望测试启动三节点集群、跑真实流量、加入并激活节点 4、onboard 一个 Slot 副本、标记 leaving、排空、移除并证明全程无发送错误。计划中记录的证据为主冒烟ok ... 241.625sdynamic_node_join164.029s、dynamic_node_readiness208.090s。10. 错误处理、性能约束与交付规则错误处理设计文档第 12 节健康报告写入在发送侧是 best-effort一旦被 ControllerV2 接受即持久化。写入失败时本地运行时记录有界告警、metrics 记录带有限原因的失败计数、下一周期重试若报告始终无法提交放置与移除最终会观察到 stale/unknown 并 fail closed。Controller leader 切换不得产生重复不安全状态报告幂等不会回退更新报告的ReportSeq。manager API 对不安全操作返回有界冲突响应并尽量附带阻断原因不暴露原始内部错误。性能约束这是生产就绪工作必须保护热路径——SEND、append、fetch、delivery、presence 等热路径不得同步等待健康上报健康报告是每节点而非每 channel/session的低频控制面写入manager 默认列表 API 必须保持分页/轻量scale-in 清单 API 可以扫描显式清单但扫描必须有界或作为 detail/status 操作暴露设计必须对 256 哈希槽、大群、高消息频率、多 channel、多在线用户规模保持有效。交付Handoff规则主计划全部已完成按 9A → 9B → 9C → 9D 顺序执行子阶段除非用户明确要求合并每个子阶段使用一个聚焦分支/提交修改前先阅读所触及包的FLOW.md行为变化时同步更新保持健康报告写入有界不引入单节点部署的 cluster-bypass 路径每个子阶段在 Gate 命令通过后才更新主计划的 Gate 状态。推荐执行模式Stage 9 横跨 ControllerV2 持久化、clusterv2 运行时回路、manager DTO、metrics 与 e2ev2 流量主计划推荐使用 subagent-driven development——每个子阶段一个全新 subagent阶段之间做评审比把整个特性放在一个会话中批量完成更安全。11. 小结Stage 9 通过四个可独立评审的子阶段把 WuKongIM 动态数据节点从“功能可用”推进到“生产可运维”9A建立每节点一份、领导者侧打时、幂等单调的持久化健康报告并以Updated语义隔离健康写与逻辑 revision使 CAS 围栏不再受心跳抖动影响9B用共享谓词NodeSchedulableForPlacement让所有新放置消费 freshaliveruntime-ready 证据让 scale-in/remove 以显式字段blocked_by_health、health_report_age_ms、blocked_reasons等解释每一次拒绝9C以白名单枚举标签的指标族与 manager JSON 字段把就绪度、健康年龄、尝试次数与阻断原因变成运维证据9D用真实进程、真实 WKProto 流量、公共 API 的黑盒冒烟证明“加入—激活—onboard—排空—移除”可以在业务不中断下完成。对读者而言这套“持久化证据 新鲜度判定 fail-closed 门禁 有界原因解释”的模式不仅适用于 WuKongIM 的动态扩缩容也是任何需要在控制面高频心跳与低频强一致事实之间做取舍的分布式系统的一个值得参考的工程范式。赞分享即时通讯后端【免费下载链接】WuKongIMMore than just IM 不只是即时通讯(IM)项目地址https://gitcode.com/gh_mirrors/wu/WuKongIM点击查看免费下载相关推荐WuKongIM 动态节点生命周期 Stage 4MarkNodeLeaving、Fail-Closed 安全报告与有界 Slot 缩容排空实战WuKongIM 动态节点生命周期 Stage 4MarkNodeLeaving、Fail Closed 安全报告与有界 Slot 缩容排空实战 本篇基于 W即时通讯后端WuKongIM v3 文档 Phase 14JavaScript/Web 集成验收闭环与 fail-closed 生产就绪门禁WuKongIM v3 文档 Phase 14JavaScript/Web 集成验收闭环与 fail closed 生产就绪门禁 本篇技术指南围绕 WuKon即时通讯后端WuKongIM 动态节点生命周期 Stage 1持久化生命周期读取模型与 Seed-Join 配置基础实现计划解析WuKongIM 动态节点生命周期 Stage 1持久化生命周期读取模型与 Seed Join 配置基础实现计划解析 本文基于 WuKongIM 仓库中 in即时通讯后端上一篇Dell G15 散热控制开盖 2 秒进入游戏这款 AWCC 替代开源工具怎么用下一篇Direct3D 12 异构多 GPU 协同渲染示例基于共享堆Shared Heaps的工作负载分配创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

快速吃透 PiD 数据加载:WebDataset 多 tar 同步迭代与 Shardlist 分片 6 大机制全解析

快速吃透 PiD 数据加载:WebDataset 多 tar 同步迭代与 Shardlist 分片 6 大机制全解析

【免费下载链接】PiD [NeurIPS 2026] PiD: Fast and High-Resolution Latent Decoding with Pixel Diffusion 项目地址: https://gitcode.com/gh_mirrors/pid18/PiD 点击查看 免费下载 PiD 是一个面向高分辨率图像的潜空间解码器(Fast and High-Resolut…

2026/10/16 2:48:56 阅读更多 →
uniapp小程序分享统一封装:Mixin接管onShareAppMessage避坑指南

uniapp小程序分享统一封装:Mixin接管onShareAppMessage避坑指南

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

2026/10/16 2:48:56 阅读更多 →
四小时学会OpenCV+Qt:从环境配置到显示第一张图片

四小时学会OpenCV+Qt:从环境配置到显示第一张图片

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

2026/10/16 2:48:56 阅读更多 →

最新新闻

面试复盘总漏关键信息?2026年7款面试复盘工具实测横评与选型指南

面试复盘总漏关键信息?2026年7款面试复盘工具实测横评与选型指南

面试这件事,最怕的不是当场答不上来,而是聊完就忘。面试官回忆不起候选人提到的项目细节,求职者想不起面试官反复追问的那个点,HR 手里只剩下几行潦草笔记。于是"复盘"两个字,常常变成凭印象打分。印象一旦失…

2026/10/16 3:35:06 阅读更多 →
IIEM实践:MATLAB自适应二重积分与奇异主部抽取解决积分方程近奇异问题

IIEM实践:MATLAB自适应二重积分与奇异主部抽取解决积分方程近奇异问题

简介:面向电磁散射建模与遥感定量反演研究者,这份开源代码实现了Hsieh等人(1997)改进的积分方程模型(IEM),用于粗糙表面后向散射系数计算。原始MATLAB版本来自Ulaby与Long(2014&…

2026/10/16 3:35:05 阅读更多 →
Nacos 2.5.0 麒麟 ARM 与达梦数据库适配编译实战指南

Nacos 2.5.0 麒麟 ARM 与达梦数据库适配编译实战指南

简介:面向国产化替代场景,这是一份Nacos 2.5.0在Linux环境下适配达梦数据库与麒麟ARM系统的完整编译产物及配套脚本,主要面向需要将微服务基础设施落地到国产软硬件栈的研发、运维与架构人员,解决服务发现、配置管理组件在国产数据…

2026/10/16 3:35:05 阅读更多 →
PowerBI数据清洗实操:用PowerQuery告别脏数据,提升模型稳定性

PowerBI数据清洗实操:用PowerQuery告别脏数据,提升模型稳定性

在PowerBI项目里,PowerQuery的数据清洗操作是我最看重的一步,也是最容易被新人跳过去的一步。很多同学把原始数据拖进模型就开始建表关系、写度量值,结果报表做到一半被脏数据反复绊倒:日期明明是文本、金额带符号、同一家门店在数…

2026/10/16 3:35:05 阅读更多 →
SpringBoot集成Elasticsearch实战:从倒排索引到搜索高亮

SpringBoot集成Elasticsearch实战:从倒排索引到搜索高亮

1. 搜索引擎ES到底能解决什么问题先说个我自己的经历。早两年我参与过一个内容管理系统的改造,数据库里存了上百万条文章数据,业务方提的需求越来越离谱:标题要支持模糊搜索、正文要高亮命中词、还要按某个字段做聚合统计。刚开始用MySQL的LI…

2026/10/16 3:35:05 阅读更多 →
VSCode配置C++开发环境:MinGW-w64编译器与调试全攻略

VSCode配置C++开发环境:MinGW-w64编译器与调试全攻略

1. 项目背后的核心问题:VSCode的"C环境配置"才是真正的门槛先说一个很多新手搞错的地方:VSCode本身不是编译器。它只是一个编辑器,负责高亮代码、提示语法、帮助你编辑文件;而把Hello World变成能运行的程序&#xff0c…

2026/10/16 3:34:05 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →