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 物件的摘要版本。
task
{ "taskUid": 0, "indexUid": "movies", "status": "enqueued", "type": "indexCreation", "enqueuedAt": "2021-08-11T09:25:53.000000Z" }
使用摘要任務的 taskUid 來追蹤任務進度。
taskUid
status
任務始終包含一個欄位,指示任務目前的 status。此欄位具有以下其中一個可能的值
enqueued
processing
succeeded
failed
canceled
succeeded、failed 和 canceled 任務是已完成的任務。Meilisearch 會將它們保留在任務資料庫中,但已完成處理這些任務。可以設定 webhook,在任務完成時通知外部服務。
enqueued 和 processing 任務是未完成的任務。Meilisearch 要不正在處理它們,要不將來會處理。
某些任務類型不與特定索引相關聯,而是適用於整個執行個體。這些任務稱為全域任務。全域任務的 indexUid 欄位始終顯示 null。
indexUid
null
Meilisearch 將以下任務類型視為全域任務
dumpCreation
taskCancelation
taskDeletion
indexSwap
snapshotCreation
在受保護的執行個體中,您的 API 金鑰必須具有存取所有索引的權限 ("indexes": [*]) 才能檢視全域任務。
"indexes": [*]
建立任務後,Meilisearch 會將其放入佇列中。佇列中的任務會依請求的順序,一次處理一個。
當任務佇列達到其限制 (約 10GiB) 時,將會擲回 no_space_left_on_device 錯誤。使用者需要使用刪除任務端點刪除任務,才能繼續寫入操作。
no_space_left_on_device
Meilisearch 將某些任務視為高優先順序,並始終將它們放置在佇列的最前面。
以下類型的任務將盡快處理
所有其他任務會依放入佇列的順序處理。
當您請求非同步操作時,Meilisearch 會依照相同的步驟處理所有任務
在非同步操作的中途終止 Meilisearch 執行個體是完全安全的,且永遠不會對資料庫產生不良影響。
Meilisearch 會分批處理任務,將任務分組以獲得最佳效能。在大多數情況下,批次處理應該是透明的,並且不會影響整體任務工作流程。使用/batches 路由以取得有關批次及其如何處理您的任務的更多資訊。
/batches
您可以使用取消任務端點,在任務處於 enqueued 或 processing 狀態時取消任務。這樣做會將任務的 status 變更為 canceled。
當您終止 Meilisearch 執行個體時,不會取消任務。Meilisearch 會捨棄在 processing 任務上所做的所有進度,並將它們重設為 enqueued。執行個體重新啟動後,任務處理會照常進行。
已完成的任務在任務清單中仍然可見。若要手動刪除它們,請使用刪除任務路由。
Meilisearch 在任務資料庫中最多儲存 100 萬個任務。如果放入新任務會超過此限制,Meilisearch 會自動嘗試刪除最舊的 10 萬個已完成的任務。如果資料庫中沒有已完成的任務,Meilisearch 則不會刪除任何項目,並照常放入新任務。
假設您使用新增文件端點將新文件新增到您的執行個體,並收到回應中的 taskUid。
當您使用此值查詢取得任務端點時,您會看到它已 enqueued
稍後,您再次檢查任務的進度。它已成功處理,且其 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 物件
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" }
如果任務在 enqueued 或 processing 時被取消,它會具有 canceled 狀態,且 canceledBy 欄位的值不是 null。
canceledBy
在任務被刪除後,嘗試存取它會傳回task_not_found 錯誤。
task_not_found
想要包含更多詳細資訊嗎? 提出問題 在我們的公共文件儲存庫中。