任务和异步操作
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 在任务数据库中最多存储 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
(任务未找到)错误。