任務與非同步操作

    Meilisearch 中的許多操作都是以非同步方式處理。這些 API 請求不會立即處理,而是 Meilisearch 會將它們放入佇列,並按照接收順序處理。

    哪些操作是非同步的?

    每個可能需要長時間處理的操作都會以非同步方式處理。以非同步方式處理操作,可以讓 Meilisearch 處理資源密集型任務,而不會影響搜尋效能。

    目前,以下是 Meilisearch 的非同步操作

    了解任務

    當 API 請求觸發非同步流程時,Meilisearch 會建立一個任務並將其放入任務佇列中。

    任務物件

    任務是包含資訊的物件,可讓您追蹤其進度,並在發生問題時進行疑難排解。

    任務物件包含原始請求中沒有的資料,例如請求進入佇列的時間、請求類型,以及任務失敗時的錯誤代碼。

    {
        "uid": 1,
        "indexUid": "movies",
        "status": "enqueued",
        "type": "documentAdditionOrUpdate",
        "canceledBy": null,
        "details": { 
            "receivedDocuments": 67493,
            "indexedDocuments": null
        },
        "error": null,
        "duration": null,
        "enqueuedAt": "2021-08-10T14:29:17.000000Z",
        "startedAt": null,
        "finishedAt": null
    }
    

    如需詳細了解每個任務物件欄位,請參閱任務 API 參考

    摘要的任務物件

    當您對非同步操作發出 API 請求時,Meilisearch 會傳回完整 task 物件的摘要版本

    {
      "taskUid": 0,
      "indexUid": "movies",
      "status": "enqueued",
      "type": "indexCreation",
      "enqueuedAt": "2021-08-11T09:25:53.000000Z"
    }
    

    使用摘要任務的 taskUid追蹤任務進度

    任務 status

    任務始終包含一個欄位,指示任務目前的 status。此欄位具有以下其中一個可能的值

    succeededfailedcanceled 任務是已完成的任務。Meilisearch 會將它們保留在任務資料庫中,但已完成處理這些任務。可以設定 webhook,在任務完成時通知外部服務。

    enqueuedprocessing 任務是未完成的任務。Meilisearch 要不正在處理它們,要不將來會處理。

    全域任務

    某些任務類型不與特定索引相關聯,而是適用於整個執行個體。這些任務稱為全域任務。全域任務的 indexUid 欄位始終顯示 null

    Meilisearch 將以下任務類型視為全域任務

    注意

    在受保護的執行個體中,您的 API 金鑰必須具有存取所有索引的權限 ("indexes": [*]) 才能檢視全域任務。

    任務佇列

    建立任務後,Meilisearch 會將其放入佇列中。佇列中的任務會依請求的順序,一次處理一個。

    任務佇列限制

    當任務佇列達到其限制 (約 10GiB) 時,將會擲回 no_space_left_on_device 錯誤。使用者需要使用刪除任務端點刪除任務,才能繼續寫入操作。

    任務佇列優先順序

    Meilisearch 將某些任務視為高優先順序,並始終將它們放置在佇列的最前面。

    以下類型的任務將盡快處理

    1. taskCancelation
    2. taskDeletion
    3. snapshotCreation
    4. dumpCreation

    所有其他任務會依放入佇列的順序處理。

    任務工作流程

    當您請求非同步操作時,Meilisearch 會依照相同的步驟處理所有任務

    1. Meilisearch 會建立任務,將其放入任務佇列,並傳回摘要的 task 物件。任務 status 設定為 enqueued
    2. 當您的任務到達佇列最前面時,Meilisearch 會開始處理它。任務 status 設定為 processing
    3. Meilisearch 完成任務。如果任務已成功處理,則狀態設定為 succeeded,如果發生錯誤,則設定為 failed
    注意

    在非同步操作的中途終止 Meilisearch 執行個體是完全安全的,且永遠不會對資料庫產生不良影響。

    任務批次

    Meilisearch 會分批處理任務,將任務分組以獲得最佳效能。在大多數情況下,批次處理應該是透明的,並且不會影響整體任務工作流程。使用/batches 路由以取得有關批次及其如何處理您的任務的更多資訊。

    取消任務

    您可以使用取消任務端點,在任務處於 enqueuedprocessing 狀態時取消任務。這樣做會將任務的 status 變更為 canceled

    注意

    當您終止 Meilisearch 執行個體時,不會取消任務。Meilisearch 會捨棄在 processing 任務上所做的所有進度,並將它們重設為 enqueued。執行個體重新啟動後,任務處理會照常進行。

    刪除任務

    已完成的任務任務清單中仍然可見。若要手動刪除它們,請使用刪除任務路由

    Meilisearch 在任務資料庫中最多儲存 100 萬個任務。如果放入新任務會超過此限制,Meilisearch 會自動嘗試刪除最舊的 10 萬個已完成的任務。如果資料庫中沒有已完成的任務,Meilisearch 則不會刪除任何項目,並照常放入新任務。

    範例

    假設您使用新增文件端點將新文件新增到您的執行個體,並收到回應中的 taskUid

    當您使用此值查詢取得任務端點時,您會看到它已 enqueued

    {
        "uid": 1,
        "indexUid": "movies",
        "status": "enqueued",
        "type": "documentAdditionOrUpdate",
        "canceledBy": null,
        "details": { 
            "receivedDocuments": 67493,
            "indexedDocuments": null
        },
        "error": null,
        "duration": null,
        "enqueuedAt": "2021-08-10T14:29:17.000000Z",
        "startedAt": null,
        "finishedAt": null
    }
    

    稍後,您再次檢查任務的進度。它已成功處理,且其 status 已變更為 succeeded

    {
        "uid": 1,
        "indexUid": "movies",
        "status": "succeeded",
        "type": "documentAdditionOrUpdate",
        "canceledBy": null,
        "details": { 
                "receivedDocuments": 67493,
                "indexedDocuments": 67493
        },
        "error": null,
        "duration": "PT1S",
        "enqueuedAt": "2021-08-10T14:29:17.000000Z",
        "startedAt": "2021-08-10T14:29:18.000000Z",
        "finishedAt": "2021-08-10T14:29:19.000000Z"
    }
    

    如果任務失敗,回應會包含詳細的 error 物件

    {
        "uid": 1,
        "indexUid": "movies",
        "status": "failed",
        "type": "documentAdditionOrUpdate",
        "canceledBy": null,
        "details": { 
                "receivedDocuments": 67493,
                "indexedDocuments": 0
        },
        "error": {
            "message": "Document does not have a `:primaryKey` attribute: `:documentRepresentation`.",
            "code": "internal",
            "type": "missing_document_id",
            "link": "https://docs.meilisearch.com/errors#missing-document-id"
        },
        "duration": "PT1S",
        "enqueuedAt": "2021-08-10T14:29:17.000000Z",
        "startedAt": "2021-08-10T14:29:18.000000Z",
        "finishedAt": "2021-08-10T14:29:19.000000Z"
    }
    

    如果任務在 enqueuedprocessing 時被取消,它會具有 canceled 狀態,且 canceledBy 欄位的值不是 null

    在任務被刪除後,嘗試存取它會傳回task_not_found 錯誤。