Конфликт версий при использовании метода удаления elasticsearch-dsl

Итак, мы используем elasticsearch в нашем проекте Django, и мы используем библиотеку python elasticsearch-dsl.

Мы получили следующую ошибку в производстве:

ConflictError(409, '{"took":7,"timed_out":false,"total":1,"deleted":0,"batches":1,"version_conflicts":1,"noops":0,"retries":{"bulk":0,"search":0},"throttled_millis":0,"requests_per_second":-1.0,"throttled_until_millis":0,"failures":[{"index":"events","type":"_doc","id":"KJ7SpWsBZnen1jNBRWWM","cause":{"type":"version_conflict_engine_exception","reason":"[KJ7SpWsBZnen1jNBRWWM]: version conflict, required seqNo [1418], primary term [1]. current document has seqNo [1419] and primary term [1]","index_uuid":"2-fSZILVQzuJE8KVmpLFXQ","shard":"0","index":"events"},"status":409}]}')

И с лучшим форматированием:

{
    "took": 7,
    "timed_out": false,
    "total": 1,
    "deleted": 0,
    "batches": 1,
    "version_conflicts": 1,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "failures": [
        {
            "index": "events",
            "type": "_doc",
            "id": "KJ7SpWsBZnen1jNBRWWM",
            "cause": {
                "type": "version_conflict_engine_exception",
                "reason": "[KJ7SpWsBZnen1jNBRWWM]: version conflict, required seqNo [1418], primary term [1]. current document has seqNo [1419] and primary term [1]",
                "index_uuid": "2-fSZILVQzuJE8KVmpLFXQ",
                "shard": "0",
                "index": "events"
            },
            "status": 409
        }
    ]
}

Код, вызвавший ошибку, был следующим вызовом метода dsl delete:

connections.create_connection(
    hosts=[settings.ELASTICSEARCH_HOST],
    timeout=20,
)
search = EventDocument.search()
# The query is made by the django model's id
search.query('match', id=self.id).delete()

А вот определение EventDocument:

from elasticsearch_dsl import (
    Document,
    Integer,
)


class EventDocument(Document):
    id = Integer()
    # other fields

Наша самая большая проблема сейчас заключается в том, что у нас нет доступа к серверу, мы получили сообщение об ошибке через автоматическое электронное письмо, которое мы настроили для ошибок. Так что я даже не знаю, как это воспроизвести.

Надеюсь, вы можете помочь, спасибо.


person Daniel    schedule 01.07.2019    source источник
comment
Ваш ответ был бесполезен, это был вопрос о конкретной библиотеке, которая работает с ES, и вы просто копируете вставленные материалы из официальных документов, которые я уже читал в то время, вы просто пытались получить простой принятый ответ. Я не помню, как я это решил, но не благодаря этому ответу.   -  person Daniel    schedule 04.08.2020


Ответы (1)


Эта ошибка возникает из-за конфликта версий в ваших документах. Из официальных документов ES

Elasticsearch распространяется. Когда документы создаются, обновляются или удаляются, новая версия документа должна быть реплицирована на другие узлы в кластере. Elasticsearch также является асинхронным и параллельным, что означает, что эти запросы на репликацию отправляются параллельно и могут приходить к месту назначения не по порядку. Elasticsearch нужен способ гарантировать, что более старая версия документа никогда не перезапишет более новую версию.

Подробнее о том, как обрабатывать исключение version conflict http 409 в ES, читайте в этот официальный документ, который также объясняет, почему вы получаете исключение и различные способы его обработки, а также подробно объясняет концепцию.

person user156327    schedule 02.07.2019