任务和异步操作

    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跟踪任务的进度

    任务 状态

    任务总是包含一个字段来指示任务的当前 状态。此字段具有以下可能的取值之一

    succeededfailedcanceled 任务是已完成的任务。Meilisearch 将它们保存在任务数据库中,但是已完成对这些任务的处理。可以 配置网络钩子在任务完成后通知外部服务。

    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 实例是完全安全的,并且永远不会对数据库产生不利影响。

    取消任务

    您可以使用 取消任务端点,在任务 enqueuedprocessing 时取消该任务。这样做会将任务的 status 更改为 canceled

    注意

    终止 Meilisearch 实例时不会取消任务。Meilisearch 会丢弃 processing 任务中取得的所有进度,并将它们重置为 enqueued。一旦重新启动实例,任务处理就会正常进行。

    删除任务

    已完成的任务 将保持 在任务列表 中可见。要手动删除它们,请使用 删除任务路由

    美利搜索在任务数据库中存储多达 100 万个任务。如果排队等待的新任务超过此限制,美利搜索会自动尝试删除最旧的 10 万个完成任务。如果数据库中没有已完成的任务,美利搜索不会删除任何内容,而是像往常一样排队等待新任务。

    示例

    假设您使用添加文档端点向您的实例添加新文档并收到一个 taskUid 作为响应。

    当您使用此值查询获取任务端点时,您会看到它已“入队

    {
        "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
    }
    

    稍后,您再次检查任务的进度。已成功处理,并且其状态已更改为 已完成

    {
        "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"
    }
    

    如果任务失败,响应会包含一个详细的 错误 对象

    {
        "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"
    }
    

    如果任务在 入队处理 期间被取消,则该任务将具有 已取消 状态,并且 canceledBy 字段的值不为 null

    在任务被删除后,尝试访问该任务会返回task_not_found错误。