标准答案
- 双写路径简单但两个写入可能一成功一失败,失败补偿和重试容易让请求变慢或形成不一致。
- 事务 Outbox、CDC 或领域事件可以把数据库变更变成可重试消息,索引更新异步完成并允许短暂延迟。
- 索引消费者必须幂等,删除和更新要携带版本或时间条件,避免乱序事件覆盖新数据。
- 定期校对按主库抽样或全量比对索引,发现差异后重建或补发,作为异步链路的兜底。
题目解析
数据库是权威来源,搜索索引是派生视图。同步方案必须在低延迟、重复、丢失窗口、写入开销和修复能力之间取舍,不存在低成本的全链路瞬时一致。
双写最容易实现但有一成功一失败的窗口;Outbox、CDC 或领域事件能让变更可重试,但索引消费者仍会遇到乱序、重复和积压。更新和删除最好携带版本或序列。
定期抽样或全量校对是异步链路的兜底。差异发现、重建、别名切换和权限过滤都要可执行,否则索引错误只能靠用户反馈。
常见误区
- 误区:把双写当成强一致。改正:承认两个系统之间存在失败窗口,并提供重试、Outbox 或校对。
- 误区:更新事件没有版本信息。改正:携带领域版本或序列,消费者拒绝迟到事件覆盖新状态。
- 误区:没有重建索引和差异校对能力。改正:把派生数据可重建、可校验作为上线条件。