Почему массовое обновление никогда не конфликтует с запросами обновления по запросу в Elasticsearch

У меня работают два скрипта, один из которых отправляет массовые запросы в индекс:

      while true; do
    s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
    curl -s -X POST 'localhost:9200/test/_bulk' -H 'Content-Type: application/x-ndjson' -d \
    '{ "update": { "_index": "test", "_id": "1" } }
    { "doc": { "name": "update", "foo": "'$s'" } }
    { "update": { "_index": "test", "_id": "2" } }
    { "doc": { "name": "update", "foo": "'$s'" } }
    { "update": { "_index": "test", "_id": "3" } }
    { "doc": { "name": "update", "foo": "'$s'" } }
'
    echo ''
done

И еще одна отправка запросов на обновление по запросу для этих документов (я должен спать после каждого запроса, поскольку он может конфликтовать с предыдущим, если запросы отправляются слишком часто):

      while true; do
    s=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 10)
    curl -s -X POST 'localhost:9200/test/_update_by_query' -H 'Content-Type: application/json' -d \
'{
    "query": {
        "match": {
            "name": {
                "query": "update"
            }
        }
    },
    "script": {
        "lang": "painless",
        "source": "ctx._source['"'foo'"'] = '"'$s'"'"
    }
}'
    echo ''
    sleep 1
done

Судя по выходным данным двух скриптов, в массовом ответе нет сбоев конфликта. Все конфликты происходили на стороне обновления по запросу.

Согласно сообщению об ошибке конфликта: , похоже, что конфликт возникает, когда операция копируется из первичного шарда в реплику. Но объем также должен сделать это и увеличить seqNo, верно?

Есть ли вероятность того, что обновление по запросу будет успешным, но иногда возникают массовые конфликты и сбои?

1 ответ

В ваших массовых запросах всегда используется команда и, таким образом, переопределяется документ (если есть) или создается новый документ, чтобы никогда не было конфликта.

Запросы на обновление по запросу - это ... ну, обновления, и конфликты могут происходить только на этой стороне.

Если ваш запрос на обновление поступает после того, как массовый запрос переопределил существующий документ, вы получите конфликт.

Если ваш массовый запрос поступает после того, как запрос на обновление обновил документ, ничего не произойдет, потому что массовый запрос переопределит изменения, внесенные запросом на обновление, поскольку он использует команда.

Другие вопросы по тегам