任务和异步操作

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

    如果任务在 enqueued(已入队)或 processing(处理中)状态时被取消,则它将具有 canceled(已取消)状态,并且 canceledBy 字段的值将为非 null

    在任务被删除后,尝试访问它会返回 task_not_found(任务未找到)错误。