任务和异步操作

    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错误。