Files
go-sip/docs/evidence/20260921-mq-control-foundation.md
T

3.6 KiB
Raw Blame History

MQ-only:配置、身份与本地MQ基础验证(业务接线未完成)

已实现

  • Dispatcher启动必须提供--config。配置文件先校验,再访问数据库;凭据只按文件中明确的环境变量引用解析,授权时长固定15分钟。
  • JSON拒绝重复键、未知字段、大小写别名、多个顶层值、无效UTF-8及超出64 KiB的文件;按已确认v2配置Schema校验,失败不部分修改配置,也不改读旧配置来源。错误不打印凭据值。
  • SQLite通过005_dispatcher_identity.sql保存唯一逻辑身份。换ID拒绝沿用数据库;身份校验在恢复通知之前,不能由错误身份改变待发送状态。
  • store.Open/New仅打开和迁移;恢复由启动入口在校验身份后显式执行。相关重新打开/进程崩溃恢复测试已同步。
  • RabbitMQ使用三组v2 durable topic exchange、独立Dispatcher/租户队列和非持久exclusive身份占用队列。同一ID重复启动被拒绝;启动时先取得MQ身份占用,再打开业务数据库。
  • 发布只允许本D已经声明的租户出站路由;persistent、mandatory、publisher confirm与return共同判定成功。使用独立发布channel隔离迟到确认,复用连接。
  • 收发限制256 KiB;超限入站消息不进入业务处理,进入对应持久DLQ,并记录身份、消息序号和大小,不打印正文。

实际验证

本地隔离RabbitMQ 4.1容器测试证明:

  1. 两个不同UUID使用同一租户时队列不相同,D1消息不被D2收走。
  2. 重复占用同一UUID失败,不影响原连接。
  3. 跨D消费/发布被拒绝。
  4. 指定SaaS持久队列实际收到persistent消息;不启动SaaS消费者也能完成发布。
  5. 移除目标绑定后,即使broker确认,mandatory return仍导致发布失败;恢复绑定后的下一次发布正常,不被旧return污染。
  6. 262145字节入站消息在修改前错误到达业务handler;加入大小门禁后通过,实际进入对应DLQ。

配置测试也先暴露了encoding/json接受大小写别名的问题;增加权威Schema校验后拒绝。配置缺失、身份变更及恢复顺序均有回归测试。永久消息分类测试使用真实Schema错误,不只检查手写错误字符串。

最新检查:

  • Go:go1.27.1 linux/amd64。
  • 全仓go test -race -coverprofile=... ./...通过;只显式启用本机RabbitMQ测试,其余外部集成开关清除。
  • go vet ./...、构建、格式及git diff --check通过;旧v1契约与704652b无差异。
  • 总覆盖率 35.1%,尚未达到65%;config 75.7%、MQ 63.6%、tenant 85.4%,不以局部数字替代整体要求。
  • 9个文件的主动LSP检查无返回诊断,但均为inconclusive,不宣称LSP确认干净;以实际编译/vet/race结果为本轮检查依据。
  • 临时日志及覆盖率:/tmp/go-sip-mq-control.noMu1i/。该路径非长期制品。

未完成,不能签收全流程

  • contracts.SourceCommit固定为 v1;业务消费、事件构建、outbox路由和必要请求响应统一使用该 V1 包。MQ传输测试仍不证明真实外部业务已接通。
  • 旧HTTP入口、CLI/环境中的旧配置选项及旧集成测试仍需清理;配置文件权威来源已接入不等于所有旧入口已删除。
  • Broker连接丢失的通知已暴露,但所有准入/许可路径的停止联动还需验证。
  • 上传仍待改为recording.uploaded及正确的R13完成边界;未验证通知恢复不重复PUT。
  • 本轮只验证本地组件,不是完整非生产部署验收;未做ECS、SIP、真实供应商或生产验证。

当前为mq-control任务的部分证据,不关闭该任务或其余计划项。