【问题标题】:Is updating an array in Elasticsearch document thread safe?更新 Elasticsearch 文档线程中的数组是否安全?
【发布时间】:2019-02-01 19:21:59
【问题描述】:

我有一个文档,其中包含一个字符串数组作为其属性之一。

有时会从两个线程对索引执行多个更新查询,并且可能会更新同一个文档。

例如给定一个文档,其中 my_array 的值为:

my_array = [1,2,3,4]

两个线程执行以下更新查询,该查询使用不同参数在索引上运行无痛脚本。

thread_0 -> my_item=3

thread_1 -> my_item=2

int index_of_my_item = ctx._source.my_array.indexOf(params.my_item);

if (-1 != index_of_my_item) {
    ctx._source.my_array.remove(index_of_item);                    
}   

执行线程安全吗?文档中的属性值为:

my_array = [1,4]

或者是否需要考虑竞争条件?

谢谢,

【问题讨论】:

    标签: python elasticsearch concurrency


    【解决方案1】:

    ES 致力于乐观并发控制,它使用版本号来实现这一点,因此没有线程安全的概念(从 ES 角度来看)。

    只需浏览这些链接,您就会清楚地了解更新对 ES 的确切含义

    https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html https://www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control.html

    使用索引 API 更新文档时,我们会读取原始文档,进行更改,然后一次性重新索引整个文档。最近的索引请求获胜:最后索引的文档就是存储在 Elasticsearch 中的文档。如果其他人同时更改了文档,他们的更改将会丢失。

    【讨论】:

    • 谢谢,我最终使用了带有冲突 ='proceed' 的 update_by_query,因为它适合我的场景。
    猜你喜欢
    • 2023-01-26
    • 2016-06-26
    • 2020-05-07
    • 2021-05-27
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多