面试题答案
一键面试影响方面
- 字段映射问题:自动创建索引时,ElasticSearch 依据首次写入的数据动态推断字段类型。若不同数据源写入的数据类型不一致,比如一个数据源写入整数,另一个写入字符串,可能导致字段映射混乱,后续查询和聚合时出现数据错误,影响数据一致性。
- 索引配置差异:自动创建索引采用默认配置,不同数据源写入时若因默认配置满足不了业务需求,各自调整索引配置(如副本数、分片数等),会使索引在不同部分存在配置差异,影响数据的整体一致性和查询性能。
- 写入顺序与并发问题:多数据源并发写入时,自动创建索引机制可能无法保证数据按特定顺序写入,导致部分依赖顺序的数据出现不一致情况。例如,文档 A 依赖文档 B 的数据进行计算和展示,若 B 还未写入完成 A 就写入,会使 A 展示数据错误。
保证数据一致性策略
- 预定义索引结构:在多数据源写入前,根据业务需求手动创建索引并明确字段映射和索引配置。这样所有数据源都按照统一的规范写入,避免因自动创建索引导致的字段映射混乱和配置差异。例如,使用 ElasticSearch 的 API 预先定义好每个字段的数据类型、是否可搜索等属性。
- 数据验证与转换:在数据源端对要写入的数据进行严格验证和类型转换。确保所有数据源写入的数据格式和类型符合预定义的索引结构。如在应用程序代码中,对即将写入 ElasticSearch 的数据进行检查,将字符串类型的数字转换为数值类型后再写入。
- 使用分布式锁或队列:为解决并发写入导致的顺序问题,可以使用分布式锁(如 Redis 实现的分布式锁),确保同一时间只有一个数据源能写入特定索引。或者使用消息队列(如 Kafka),将多数据源的数据写入请求先发送到队列,再按顺序从队列消费写入 ElasticSearch,保证数据写入顺序。
- 版本控制:利用 ElasticSearch 自带的版本控制功能,每次写入数据时带上版本号。当多个数据源并发写入同一文档时,通过版本号比较,只有版本号符合预期的写入操作才会成功,避免数据被错误覆盖,保证数据一致性。