优化思路
- retry_on_conflict:
- 思路:
retry_on_conflict
用于指定在遇到版本冲突时的重试次数。在高并发读写场景下,合理设置该值可以避免因短暂的冲突而导致写入失败。如果设置过小,可能很多合法的写入因为临时冲突而失败;设置过大,可能会浪费资源在不必要的重试上。
- 根据业务场景分析冲突概率:如果系统中写操作并发度高,数据冲突可能性大,可以适当提高
retry_on_conflict
的值。例如,对于一些实时性要求较高的日志写入场景,即使有一定冲突,也希望通过重试来保证数据写入。而对于一些对准确性要求极高,且冲突概率相对较低的金融数据写入场景,可设置相对较小的值,因为多次重试可能引入其他风险。
- consistency:
- 思路:
consistency
选项用于控制读操作的一致性级别。不同的一致性级别对性能和数据一致性的影响不同。强一致性能保证读到最新数据,但会牺牲性能;弱一致性则相反,性能较高,但可能读到旧数据。
- 平衡一致性与性能:根据业务对数据一致性的要求选择合适的一致性级别。对于一些展示类业务,如商品展示页面,对数据一致性要求不是特别高,允许短暂的不一致,可以选择弱一致性(如
quorum
中较低的副本数要求),以提高读性能。而对于涉及关键业务逻辑的数据,如订单状态等,需要选择强一致性级别(如 quorum
要求大多数副本确认),以确保数据的准确性。
配置方案
- retry_on_conflict:
- 示例代码(以Python Elasticsearch客户端为例):
from elasticsearch import Elasticsearch
es = Elasticsearch()
doc = {
"title": "示例文档",
"content": "示例内容"
}
try:
res = es.index(index='example_index', id=1, body=doc, retry_on_conflict = 5)
print(res['result'])
except Exception as e:
print(f"写入错误: {e}")
- 在上述代码中,将
retry_on_conflict
设置为 5,表示在遇到版本冲突时,最多重试 5 次。实际应用中,可根据业务场景的冲突概率和重试成本来调整该值。
- consistency:
- 读操作示例(以Python Elasticsearch客户端为例):
from elasticsearch import Elasticsearch
es = Elasticsearch()
try:
res = es.get(index='example_index', id=1, consistency='quorum')
print(res['_source'])
except Exception as e:
print(f"读取错误: {e}")
- 在上述代码中,使用
consistency='quorum'
表示采用基于副本仲裁的一致性级别。若要实现更强一致性,可确保 quorum
所需的副本数为大多数副本(如对于 3 个副本的索引,quorum
要求 2 个副本确认)。若追求更高性能,可适当降低 quorum
所需的副本数,但需权衡数据一致性风险。