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
的字段。此字段具有以下可能的值之一
enqueued
:任务已接收,将很快处理
processing
:任务正在处理中
succeeded
:任务已成功处理
failed
:处理任务时发生故障。数据库未进行任何更改
canceled
:任务已取消
succeeded
、failed
和 canceled
任务是已完成任务。Meilisearch 将它们保留在任务数据库中,但已完成这些任务的处理。可以配置 webhook 以在任务完成时通知外部服务。 enqueued
和 processing
任务是未完成任务。Meilisearch 正在处理它们或将在未来处理它们。全局任务
某些任务类型不与特定索引关联,而是应用于整个实例。这些任务称为全局任务。全局任务的 indexUid
字段始终显示 null
。 Meilisearch 将以下任务类型视为全局任务:
在受保护的实例中,您的 API 密钥必须有权访问所有索引("indexes": [*]
)才能查看全局任务。
任务队列
创建任务后,Meilisearch 会将其放入队列中。排队的任务按照请求的顺序逐一处理。
当任务队列达到其限制(大约 10GiB)时,它将抛出 no_space_left_on_device
错误。用户需要使用删除任务端点来删除任务以继续写入操作。
任务队列优先级
Meilisearch 认为某些任务是高优先级的,并且始终将它们放在队列的最前面。 以下类型的任务始终尽快处理:
taskCancelation
taskDeletion
snapshotCreation
dumpCreation
所有其他任务都按照它们入队的顺序处理。
任务工作流
当您请求异步操作时,Meilisearch 按照相同的步骤处理所有任务
- Meilisearch 创建一个任务,将其放入任务队列,并返回一个摘要的
task
对象。任务 status
设置为 enqueued
- 当您的任务到达队列前面时,Meilisearch 开始处理它。任务
status
设置为 processing
- Meilisearch 完成任务。如果任务成功处理,状态设置为
succeeded
;如果发生错误,状态设置为 failed
在异步操作中终止 Meilisearch 实例是完全安全的,并且永远不会对数据库产生不利影响。
任务批处理
Meilisearch 以批处理方式处理任务,将任务分组以获得最佳性能。在大多数情况下,批处理应该是透明的,对整体任务工作流没有影响。使用/batches
路由获取有关批处理及其如何处理任务的更多信息。
取消任务
您可以使用取消任务端点在任务处于 enqueued
或 processing
状态时取消它。这样做会将任务的 status
更改为 canceled
。
当您终止 Meilisearch 实例时,任务不会被取消。Meilisearch 会丢弃所有在 processing
任务上取得的进展,并将它们重置为 enqueued
。一旦实例重新启动,任务处理将正常进行。
删除任务
已完成的任务在任务列表中仍然可见。要手动删除它们,请使用删除任务路由。 Meilisearch 在任务数据库中最多存储 1M 个任务。如果新任务入队会超出此限制,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
错误。