面试题答案
一键面试设计思路
- 获取索引列表:使用ElasticSearch API获取所有索引的名称列表。
- 筛选特定前缀索引:遍历索引列表,筛选出具有特定前缀的索引。
- 检查业务查询状态:与其他服务进行协调,通过以下方式确认业务查询状态:
- 消息队列:各服务将正在进行的查询任务发送到消息队列,脚本从消息队列获取信息,判断是否有涉及要删除索引的查询。
- 状态标记:在共享存储(如Redis)中设置各索引是否正在被查询的标记,脚本读取标记判断。
- 等待查询结束:若发现有业务查询正在使用要删除的索引,等待查询完成。可以设置一个超时时间,若超时仍有查询未完成,可根据实际情况决定是否强制停止或跳过删除。
处理并发冲突
- 分布式锁:使用分布式锁(如Redis锁或Zookeeper锁)确保同一时间只有一个脚本实例在执行删除操作。在获取锁后开始删除流程,操作完成后释放锁。
- 版本控制:为每个索引设置版本号,在删除前检查版本号是否变化。若版本号变化,说明有其他操作修改了索引,重新获取索引状态并判断是否可删除。
脚本整体架构
- 初始化部分:
- 配置ElasticSearch连接信息,包括主机、端口、认证信息等。
- 配置与其他服务协调的信息,如消息队列地址、共享存储地址等。
- 设定特定前缀、等待超时时间等参数。
- 协调部分:
- 实现与其他服务交互的逻辑,如从消息队列获取查询任务,读取共享存储中的索引状态标记。
- 编写等待查询结束的逻辑,包括循环检查查询状态和超时处理。
- 删除部分:
- 实现获取索引列表和筛选特定前缀索引的函数。
- 使用ElasticSearch API编写删除索引的函数,在删除前先获取分布式锁,并检查索引版本号。
- 主函数:
- 调用初始化函数。
- 进入协调部分流程,确保业务查询不影响删除操作。
- 执行删除部分逻辑,删除特定前缀索引。
- 释放分布式锁,清理资源。