任务和异步操作
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 将以下任务类型视为全局任务
dumpCreation (转储创建)
taskCancelation (任务取消)
taskDeletion (任务删除)
indexSwap (索引交换)
snapshotCreation (快照创建)
注意
在受保护的实例中,您的 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
错误。