主题
PostgreSQL 与 Milvus 双存储怎样保证数据一致性?
题型:深入 · 不要承诺不存在的分布式事务,要说明最终一致和修复机制。
建议回答
PostgreSQL 作为元数据和任务状态的事实来源,documentId、documentVersion、chunkId 在解析阶段生成并保持稳定。Ingestion 通过状态机记录解析、切分、Embedding、Milvus 写入、全文索引和发布等阶段,每一步都可幂等重试。新版本完成两套索引后再把文档状态切换为可检索,在线查询只读取已发布版本。
如果 PostgreSQL 成功而 Milvus 失败,任务保持未发布并继续补偿;如果 Milvus 写入成功但状态更新失败,使用相同主键 upsert,恢复时通过任务记录重放。后台对账任务比较各版本 chunk 数量、ID 集合和校验摘要,发现孤儿向量或缺失记录后修复或重建。
关键设计
- 稳定主键加 upsert,保证重试幂等。
- 版本化发布,避免用户读到半成品。
- 删除采用先失效、后异步清理,避免检索窗口泄漏旧数据。
- 权限和租户字段在两边保持一致,并纳入对账。
易错点
- 双写不能简单包装在一个本地事务里。
- 只比较数量不够,还要校验版本、ID、权限和内容摘要。