Elasticsearch — Урок 4.3 Конкуренция при обновлении

Ранее мы обсуждали, что операция обновления должна сначала получить старый документ, применить изменения и переиндексировать документ. Если в процессе извлечения и изменения данных, кто-то еще изменить их, данные изменения будут утеряны и заменены вашими. Чтобы решить эту проблему, Elasticsearch увеличивает версию документа для каждой операции.

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

Ответ на предыдущую операцию выглядит следующим образом:

Вы можете видеть из предыдущего ответа, что версия документа равна 4. Для следующего обновления мы можем указать версию:

Операция выполняется только в том случае, если текущая версия равна 4. Вот успешный ответ:

Если вы сейчас попытаетесь запустить обновление с версией 4, вы увидите ответ 409 HTTP response code, как показано ниже:

Чтобы избежать сбоя из-за конфликта, вы можете попросить Elasticsearch повторить попытку. Количество попыток до завершения операции может быть задано с помощью retry_on_conflict, как показано ниже:

В данном случае будет предпринято три попытки применить изменения.