用 sqlite + RabbitMQ 4.3.6 复现并解决双写问题:先写库再发消息会丢消息(1000 单丢 58 条);Outbox 模式(订单与待发送事件同事务,relay 轮询发布)不丢但重复 60 条,至少一次;配合下游去重业务只执行 1000 次;relay 延迟约等于 poll 间隔,批量标记把吞吐从 2852 提到 5471 行/秒。
在 RabbitMQ 4.3.6 上实测消费者崩溃后未确认消息的重新投递:kill -9 后 381 ms 回队列;确认过的不重投、未确认的回到队首且 redelivered=True;网络黑洞靠心跳 8.6 s 才回队列;quorum 队列有 x-delivery-count 和 x-delivery-limit(重投 3 次后丢弃),经典队列只有 redelivered 布尔值。
实测 git 的凭据协议:用 git credential fill / approve / reject 驱动 helper 的 get / store / erase,stdin 是 key=value 行;useHttpPath 决定是否传 path;用 git http-backend 起一个要求 Basic 认证的本机服务,看到 401 → helper get(带 wwwauth 质询)→ 带认证的请求 → store,密码错则 erase;多个 helper 取凭据按顺序第一个给出的赢、存凭据广播;credential-store 明文保存,权限 600。
实测 clean/smudge 过滤器:add 时 clean 后存进 blob(工作区不变),checkout 时 smudge;status/diff 在内容或 stat 变化时调用 clean;clean 有损时真实内容会在检出时丢失;hash-object --no-filters 看原样内容;clean(smudge(x)) 必须等于 x;自定义 merge driver 收到 %O %A %B %L %P,退出 0 采用 %A 里的结果;内置 text/binary/union 对同一冲突的处理。
实测 git maintenance:10 个任务名各自改变仓库的什么(loose-objects 两次才清理松散对象、pack-refs、commit-graph、geometric-repack、gc);prefetch 把远程分支下载到 refs/prefetch;maintenance.strategy 的四种取值实际启动的子命令;--auto 的阈值(commit-graph.auto 与 loose-objects.auto 默认 100,达到才运行);maintenance.<任务>.enabled 的效果。
实测对象数量增长时各命令的耗时:提交数 1,000 → 40,000 时 status 与 log -1 不变、整段历史的遍历随提交数增长;文件数 1,000 → 50,000 时 status、add -A、commit 随文件数增长;松散对象的遍历比打包慢约 10 倍、占盘约 32 倍;带路径的 log 在 commit-graph 与 --changed-paths 下从 246 ms 降到 76 ms;file:// 克隆的耗时与大小。
把 BSON 文档逐字节拆开:总长度、类型字节、键名 C 字符串、各类型值的字节数、字符串长度前缀、数组就是键为 "0""1" 的子文档;键名每个文档都存一遍,在内存里差 3 倍、压缩后的磁盘上只差约 29%;用 mongosh 的 bsonsize 与 $bsonSize 验证 Python 编码的字节数。
实测 BSON 跨类型的比较顺序:升序排序依次是 MinKey、null、数字、字符串、对象、BinData、ObjectId、布尔、日期、Timestamp、正则、MaxKey;比较运算只在同一类型括号内匹配,null 与字段缺失的差别,数组按最小或最大元素排序,子文档按字段逐个比较。
实测数字类型混用:int32、int64、double、Decimal128 的 1 在查询里互相相等;int64 与 double 精确比较;0.1 的 double 与 Decimal128 不相等;唯一索引把四种 1 当成同一个值;$add 与 $sum 的类型提升;mongosh 里超过 2^53 的 JS 数字会悄悄变成 double。
实测 ObjectId 的 12 个字节:4 字节秒级时间戳、5 字节进程内随机值、3 字节起点随机的计数器(会回绕);同一进程内严格递增,多个进程之间 _id 的排序不等于创建顺序;_id 缺省时驱动会在发送前补上,绕过驱动服务端也会补。
实测 MongoDB 的文档大小与嵌套深度上限:maxBsonObjectSize 是 16,777,216 字节,刚好等于的文档能插入、多 1 字节被服务端用错误码 10334 拒绝;update 撑过上限的报错;嵌套深度在 9.0.2 上限是 180 层;聚合里 $push 出的文档可以超过 16 MiB 返回客户端,但写进集合会失败。
实测 BSON 字段顺序:子文档整体匹配、$expr 比较、$group 分组键和唯一索引都把字段顺序当成值的一部分,点号路径匹配与顺序无关;$set 保持原位、新字段追加末尾,$unset 再 $set 跑到末尾;_id 总在最前;mongosh 的 JS 对象会把整数键排到最前面。