version=1&version_type=external 和 if_seq_no=0&if_primary_term=1 之间的区别
Difference between version=1&version_type=external and if_seq_no=0&if_primary_term=1
基于这个,显然可以说:
- 版本是一个序号,用于计算文档更新的次数;
- _seq_no是一个序号,统计索引上发生的操作次数,与
primary_term
一起使用,唯一确定索引上的版本;
但是作为用户,version=1&version_type=external
和if_seq_no=0&if_primary_term=1
在实现并发控制上有什么区别吗?
我的理解是:
要实现“外部”并发控制,if_seq_no=0&if_primary_term=1
会稍微不方便一些,因为我们要在DB中同时记录两个字段,而我们只需要记录version
至于version=1&version_type=external
.
至于“内部”并发控制,if_seq_no=0&if_primary_term=1
会提高并行度,而version
相对较差。
这两个结论对吗?如果正确,具体为什么?
我在ES 7.4.2做了一些简单的实验如下:
POST test/_bulk
{"index": { "_id": 1 }}
{"test": 1}
{"index": { "_id": 2 }}
{"test": 2}
PUT test/_doc/1?version=1&version_type=external&error_trace=true
{
"test": 1
}
GET test/_doc/1
PUT test/_doc/1?if_seq_no=0&if_primary_term=1&error_trace=true
{
"test": 1
}
基于这个旧的postElasticsearch Versioning Support,我看到_version
在ES中用于并发控制。
虽然在Breaking changes in 6.7,我可能只是在这里引用。
internal version may not uniquely identify a document’s version if an indexed document wasn’t fully replicated when a primary fails. As such it is unsafe to use for optimistic concurrency control, is deprecated and the option will no longer be available in Elasticsearch 7.0.0. Please use the if_seq_no and if_primary_term parameters instead.
所以基本上答案是:
- 如果我们有外部版本控制系统,我们可以将它们都用作“外部”并发控制;
- 虽然ES的“内部”并发控制,我们应该使用
if_seq_no=0&if_primary_term=1
作为唯一的选择。
基于这个
- 版本是一个序号,用于计算文档更新的次数;
- _seq_no是一个序号,统计索引上发生的操作次数,与
primary_term
一起使用,唯一确定索引上的版本;
但是作为用户,version=1&version_type=external
和if_seq_no=0&if_primary_term=1
在实现并发控制上有什么区别吗?
我的理解是:
要实现“外部”并发控制,
if_seq_no=0&if_primary_term=1
会稍微不方便一些,因为我们要在DB中同时记录两个字段,而我们只需要记录version
至于version=1&version_type=external
.至于“内部”并发控制,
if_seq_no=0&if_primary_term=1
会提高并行度,而version
相对较差。
这两个结论对吗?如果正确,具体为什么?
我在ES 7.4.2做了一些简单的实验如下:
POST test/_bulk
{"index": { "_id": 1 }}
{"test": 1}
{"index": { "_id": 2 }}
{"test": 2}
PUT test/_doc/1?version=1&version_type=external&error_trace=true
{
"test": 1
}
GET test/_doc/1
PUT test/_doc/1?if_seq_no=0&if_primary_term=1&error_trace=true
{
"test": 1
}
基于这个旧的postElasticsearch Versioning Support,我看到_version
在ES中用于并发控制。
虽然在Breaking changes in 6.7,我可能只是在这里引用。
internal version may not uniquely identify a document’s version if an indexed document wasn’t fully replicated when a primary fails. As such it is unsafe to use for optimistic concurrency control, is deprecated and the option will no longer be available in Elasticsearch 7.0.0. Please use the if_seq_no and if_primary_term parameters instead.
所以基本上答案是:
- 如果我们有外部版本控制系统,我们可以将它们都用作“外部”并发控制;
- 虽然ES的“内部”并发控制,我们应该使用
if_seq_no=0&if_primary_term=1
作为唯一的选择。