先这样答
知识库更新期间,我会用版本化索引处理一致性。新索引构建完成前,旧索引继续提供查询。新索引准备好后,再让查询从旧版本切到新版本。
比较稳妥的做法是让新旧索引并存。系统先完整准备新索引,再通过别名切换让版本原子生效。切换前,查询仍然指向旧索引。切换后,查询统一指向新索引。这样不会出现一部分请求读旧索引、另一部分请求读新索引的混杂状态。
如果业务需要持续接收更新,也可以采用双写加灰度切流。更新内容同时写入新旧索引,再逐步把查询流量切到新索引。面试中我不会只回答先删旧索引、再创建新索引。这个方案没有说明切换期间如何保证一致性,继续追问时就很难回答。
面试官会怎么追问
-
「为什么不能先删掉旧索引,再创建新索引?」 先删后建会产生索引空档。更新期间,查询可能没有稳定的数据来源。这个做法也没有解决新旧数据混在一起的问题。
-
「别名切换具体解决了什么?」 别名让查询使用一个统一入口。新旧索引可以同时存在,准备完成后再切换指向。切换原子生效,查询不会在两个版本之间随机选择。
-
「新索引构建期间还要继续接收数据,怎么处理?」 可以采用双写方案,让更新内容同时写入新旧索引。新索引准备好后,再通过灰度切流逐步使用新索引。这样可以覆盖构建期间持续发生的更新。
回答的坑
只说先删旧索引、再创建新索引,没有回答切换期间的一致性问题。
只说新旧索引并存,却没有说明用别名原子切换或双写灰度切流。
同系列的题
—— 本题完 ——