任务和异步操作
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
以 跟踪任务的进度。
任务 状态
任务总是包含一个字段来指示任务的当前 状态
。此字段具有以下可能的取值之一
enqueued
: 任务已收到,并将在不久后进行处理processing
: 任务正在处理中succeeded
: 任务已成功处理failed
: 在处理任务时发生故障。不会对数据库进行任何更改canceled
: 任务已取消
succeeded
、failed
和 canceled
任务是已完成的任务。Meilisearch 将它们保存在任务数据库中,但是已完成对这些任务的处理。可以 配置网络钩子在任务完成后通知外部服务。
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 实例是完全安全的,并且永远不会对数据库产生不利影响。
取消任务
您可以使用 取消任务端点,在任务 enqueued
或 processing
时取消该任务。这样做会将任务的 status
更改为 canceled
。
注意
终止 Meilisearch 实例时不会取消任务。Meilisearch 会丢弃 processing
任务中取得的所有进度,并将它们重置为 enqueued
。一旦重新启动实例,任务处理就会正常进行。
删除任务
已完成的任务 将保持 在任务列表 中可见。要手动删除它们,请使用 删除任务路由。
美利搜索在任务数据库中存储多达 100 万个任务。如果排队等待的新任务超过此限制,美利搜索会自动尝试删除最旧的 10 万个完成任务。如果数据库中没有已完成的任务,美利搜索不会删除任何内容,而是像往常一样排队等待新任务。
示例
假设您使用添加文档端点向您的实例添加新文档并收到一个 taskUid
作为响应。
当您使用此值查询获取任务端点时,您会看到它已“入队
”
{
"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
}
稍后,您再次检查任务的进度。已成功处理,并且其状态
已更改为 已完成
{
"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"
}
如果任务失败,响应会包含一个详细的 错误
对象
{
"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"
}
如果任务在 入队
或 处理
期间被取消,则该任务将具有 已取消
状态,并且 canceledBy
字段的值不为 null
。
在任务被删除后,尝试访问该任务会返回task_not_found
错误。