面试题答案
一键面试1. 乐观并发控制面临的性能问题
- 频繁版本检查开销:每次更新都需检查版本号,随着并发量增加,此操作带来额外网络和计算开销,影响性能。
- 更新冲突重试成本:若版本冲突导致更新失败,客户端需重试,多次重试消耗额外资源,增加系统负载。
2. 优化措施
- 批量操作:将多个更新请求合并为一个批量请求,减少版本检查次数和网络开销。例如,使用
_bulk
API 。
{ "update": {"_id": "1", "_index": "your_index"}}
{ "doc": {"field": "new_value"}}
{ "update": {"_id": "2", "_index": "your_index"}}
{ "doc": {"field": "new_value"}}
- 减少不必要版本检查:对一些不依赖版本的操作(如创建文档且已知文档不存在时),可不进行版本检查。
3. ElasticSearch对版本冲突导致更新失败的处理
ElasticSearch 在版本冲突时,默认返回 HTTP 409 Conflict 状态码,告知客户端更新失败。
4. 应对版本冲突的业务逻辑设计
- 自动重试:客户端捕获版本冲突异常后,设置合理的重试次数和重试间隔进行自动重试。
import elasticsearch
es = elasticsearch.Elasticsearch()
retry_count = 3
for i in range(retry_count):
try:
es.update(index='your_index', id='your_id', doc={'field': 'new_value'}, version_type='external', version=1)
break
except elasticsearch.ConflictError:
if i == retry_count - 1:
raise
- 先读再写:更新前先获取文档当前版本号,确保在更新时使用最新版本号。
doc = es.get(index='your_index', id='your_id')
version = doc['_version']
es.update(index='your_index', id='your_id', doc={'field': 'new_value'}, version_type='external', version=version)
- 业务逻辑补偿:若重试多次仍失败,记录失败操作,后续通过人工或补偿任务处理。