知其然,知其所以然
MongoDB 2026-10-12

因果一致性会话

实测因果一致性会话:写 primary 后立刻读 secondary,不带会话 3000 次里有 2052 次读到旧值,带会话 0 次;用 stopReplProducer 让 secondary 落后,因果读阻塞约 3 秒直到追上;读命令里带 afterClusterTime;operationTime 可以手工在会话间传递,没有传递就没有保证。

MongoDB 因果一致性 causal consistency afterClusterTime 读写后一致 副本集 真实验证 动画演示
MongoDB 2026-10-12

游标:batchSize、getMore 与 10 分钟超时

实测游标:第一批 101 个、后续批次按 16 MiB 装(70,538 个);batch_size=10 读 10 万个文档要 10,001 条命令 944 ms,默认 3 条 54 ms;不带会话的游标空闲超时被回收(code 43),会话里的游标不受影响,noCursorTimeout 不会超时;遍历期间被修改的文档会被重复读到(1,500 次)。

MongoDB 游标 batchSize getMore cursorTimeoutMillis noCursorTimeout 真实验证 动画演示
MongoDB 2026-10-12

可重试写入:txnNumber 怎么避免重复执行

实测可重试写入:驱动重试带着同一个 lsid 和 txnNumber,计数器只加 1;服务端靠 oplog 条目上的 lsid / txnNumber / stmtId 去重,手写 OP_MSG 重发同一个请求返回 retriedStmtIds 而不再执行;insert 的整批重发只插入一次;update_many 不可重试;独立实例不支持事务号。

MongoDB 可重试写入 retryWrites txnNumber stmtId 幂等 真实验证 动画演示
爬虫工程 2026-10-12

正则提取为什么在 HTML 上会坏

同一个提取目标在 12 种略有差异的 HTML 写法上:最直接的正则只答对 3 种,更宽松的正则 5 种,lxml 解析 12 种全对;正则会漏掉属性顺序/引号/空白差异,多取注释和 script 里的假标签,不解码实体不去标签;嵌套量词的正则 L=26 要 4.1 秒;而正则只比 lxml 快约 4.6 倍(1.39 对 6.43 ms)。

爬虫 正则表达式 HTML解析 lxml 灾难性回溯 正确性 Python 真实验证 动画演示
MongoDB 2026-10-12

E11000 错误信息里有什么

实测 E11000 错误里的信息:code 11000、message 里的集合名 + 索引名 + dup key,以及 keyPattern 与 keyValue;单字段、复合、嵌套字段上的形状;同时违反两个唯一索引一次只报一个;长键在 message 里被截断而 keyValue 完整;批量与更新里的写法和“插入或取回”模式。

MongoDB E11000 重复键 唯一索引 keyPattern keyValue 真实验证 动画演示
MongoDB 2026-10-12

$set 一个字段,oplog 里存的是什么(diff 格式)

实测 $set 一个字段时 oplog 里存的是 diff:{$v: 2, diff: {u: …}},u 是新值、d 是删除、i 是新增、s<字段> 递归子文档与数组;$inc 记结果值;$pop 和 $pull 记整个数组;100 KB 文档改一个字段的 oplog 条目只有 165 字节,replace_one 要 100,157 字节;没有变化的 update 不写 oplog。

MongoDB oplog update diff 复制 $set 真实验证 动画演示
爬虫工程 2026-10-12

页面改版检测:提取结果校验与告警

模拟 8 个版本的改版:同一个提取器没有一个版本抛异常,但 v3 抓到 0 个商品、v5 价格悄悄 ×100;只看异常命中 0 / 5,字段空值率命中 4 / 5,价格中位数偏离命中 3 / 5,组合检查 5 / 5(1 个误报);灰度发布时整体平均失败率只有 22%,个别页面却是 100%。

爬虫 页面改版 数据校验 监控告警 XPath 静默失败 Python 真实验证 动画演示
爬虫工程 2026-10-12

找到真实数据接口:SPA 页面背后的请求

用 Chrome 的 CDP Network 事件记录一个单页应用加载时发的 7 个请求,找到真正含数据的 /api/products;直接用 requests 重放要补上 Cookie(缺了 401)和 X-Requested-With(缺了 403);3 次请求取到 25 条,2 ms,而浏览器渲染要 63 ms;API 还多返回页面没显示的字段。

爬虫 单页应用 XHR Fetch CDP Network 接口分析 requests Python 真实验证 动画演示
爬虫工程 2026-10-12

headless Chrome:启动耗时与内存占用

实测 headless Chrome 154 的开销:冷启动到调试端口可用中位 396 ms,新开标签页加载简单页面 24 ms;0 个标签页就有 9 个进程、RSS 之和约 1177 MiB,每多一个标签页多一个渲染进程、约 +109 MiB(同一站点与不同站点一样);用 CDP 拦截图片和样式让加载从 31 ms/2052 KiB 降到 13 ms/1 KiB。

爬虫 headless Chrome CDP 启动耗时 内存 标签页 资源拦截 Python 真实验证 动画演示
MongoDB 2026-10-12

initial sync:新节点加入时做了哪几步

实测新成员加入副本集的 initial sync:STARTUP → STARTUP2 → SECONDARY,121 MB 数据约 2.5 秒(logical 方式,约 1 秒复制完);replSetGetStatus 的 initialSyncStatus 给出进度字段;日志里的里程碑;同步期间的并发写入也会到齐,dbHash 一致;新成员的 oplog 从同步点开始。

MongoDB initial sync 副本集 新成员 STARTUP2 真实验证 动画演示
MongoDB 2026-10-12

复制延迟与 maxStalenessSeconds

实测复制延迟与 maxStalenessSeconds:健康时 0~2 秒;用 failpoint 让一个 secondary 停拉 oplog,延迟随时间线性增长到 95 秒;不设 maxStaleness 的 secondary 读 50 次有 19 次读到旧值,maxStalenessSeconds=90 的只有 1 次;下限 90 秒;放开后 3 秒追平。

MongoDB 复制延迟 maxStalenessSeconds secondary读 副本集 真实验证 动画演示
爬虫工程 2026-10-12

等待策略:固定等待、元素等待、网络空闲

在会随机延迟加载数据的本机页面上比较等待策略:固定等待 0.5 秒只有 5 / 12 成功,1.5 秒成功但多等 916 ms;轮询到期望的元素数量几乎不多等(约 45 ms);只等第一个元素在分两阶段加载的页面上 0 / 12;网络空闲在有长连接的页面上永远等不到(6035 ms 到上限)。

爬虫 等待策略 网络空闲 CDP headless Chrome 动态页面 Python 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号