簡體   English   中英

使用elasticsearch-dsl的delete方法時版本沖突

[英]Version conflict when using the delete method of elasticsearch-dsl

因此,我們在 Django 項目中使用了 elasticsearch,並且使用了 elasticsearch-dsl python 庫。

我們在生產中遇到以下錯誤:

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

我們現在最大的問題是我們無權訪問服務器,我們通過為錯誤配置的自動電子郵件收到錯誤。 所以我什至不知道如何重現它。

希望能幫到你,謝謝。

由於文檔中的版本沖突,發生此錯誤。 來自 ES 官方文檔

Elasticsearch 是分布式的。 創建、更新或刪除文檔時,必須將文檔的新版本復制到集群中的其他節點。 Elasticsearch 也是異步並發的,這意味着這些復制請求是並行發送的,並且可能會亂序到達目的地。 Elasticsearch 需要一種方法來確保文檔的舊版本永遠不會覆蓋新版本。

官方文檔中閱讀有關如何處理 ES 中version conflict http 409異常的更多信息,其中還解釋了為什么會出現異常以及如何處理它的各種方法,並詳細解釋了概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM