异步任务处理

IMM支持多种数据输出,其中有些处理时间会比较长,无法在一次同步请求中返回。因此IMM提供了一类API来异步处理这种请求,这类API通常以CreateXXXTask命名,同时提供了结果获取的消息通知方式。

说明

IMM提供的异步任务API适用于那些处理时间较长、无法在一次同步请求中返回的场景。通过异步处理方式,可以避免阻塞主线程,提高系统性能,并在后台完成数据处理、计算量大的操作,或者定时任务,而不影响用户体验。

任务处理流程

  1. 开发者上传源数据至阿里云对象存储OSS。

  2. 开发者调用IMM API接口CreateXXXTask发起异步任务处理请求。

  3. IMM从开发者指定的OSS地址获取源数据进行数据处理。

  4. IMM将数据处理结果写回开发者指定的OSS地址。

  5. IMM处理完数据后,将任务状态发送至开发者指定的MNS或RocketMQ。

  6. MNS或RocketMQ将消息推送至开发者的服务中。

任务输入输出

  • 输入数据参数一般以Source命名,包括如下参数:

    • SourceURI:数据源地址,目前仅支持OSS URI。

    • Sources:多个输入URI地址数组。

    • Source:多个输入URI对象。

  • 输出数据参数一般以Target命名,包括如下参数:

    • TargetURI:目标地址,该地址支持模板语法。

    • TargetURIPrefix:目标地址前缀。

    • Target:多个输出URI对象。

重要

输入数据和输出数据需要和IMM在同一个地域。

OSS URI

OSS URI是用来定位唯一的一个OSS资源,其格式为oss://<bucket>/<object>,例如oss://test-bucket/test-object/test.docx

说明

Bucket为和当前项目处于同一地域的OSS Bucket名称,Object为包含文件扩展名的文件完整路径。

常见的错误输入格式:

  • http://bucket.oss-cn-hangzhou.aliyuncs.com/test-object/test.docx

  • oss://bucket.oss-cn-hangzhou.aliyuncs.com/test-object/test.docx

TargetURI模板

TargetURI模板是在URI提供一些占位符,使用时用实际的值去替换占位符,从而动态生成实际的URI地址。例如oss://{bucket}/{tags.custom}/{dirname}/{barename}.{autoext}

关于TargetURI的更多信息,请参见TargetURI 模板

授权机制

异步任务处理的输入数据和输出数据均为开发者提供的地址,需要授权IMM服务输入数据的读权限和输出数据的写权限。这些权限来自于ProjectName参数,在CreateProject - 创建项目接口中,通过参数ServiceRole指定了一个授权给IMM的服务角色(默认为AliyunIMMDefaultRole,开通服务时自动创建),IMM在异步任务处理中会通过扮演这个服务角色获取和上传数据。

获取任务状态

通过MNS或RocketMQ获取任务状态

任务处理流程中所述,开发者可以通过设置MNS或RocketMQ来接收IMM的任务处理状态,这也是IMM推荐的使用方式。MNS通知消息格式请参见异步通知消息格式

重要

MNS或RocketMQ需要和IMM在同一个地域。

  • 通过Notification参数指定MNS或RocketMQ配置接收异步消息通知(推荐)

    • MNS:通过Notification参数中的MNS参数指定MNS通知地址和主题接收异步消息通知。

      {
        "Notification": {
          "MNS": {
            "Endpoint": "MNS消息通知地址",
            "TopicName": "MNS消息通知主题"
          }
        }
      }
    • RocketMQ:通过Notification参数中的RocketMQ参数指定RocketMQ通知地址、主题和实例ID接收异步消息通知。

      {
        "Notification": {
          "RocketMQ": {
            "Endpoint": "RocketMQ消息通知地址",
            "TopicName": "RocketMQ消息通知主题",
            "InstanceId": "RocketMQ消息通知实例Id"
          }
        }
      }
  • 通过NotifyEndpoint和NotifyTopicName两个参数指定MNS接收地址和主题接收异步消息通知

    • NotifyEndpoint:MNS消息通知地址,默认为调用者的MNS地址。

    • NotifyTopicName:MNS消息通知主题,为空则不会发送消息通知。

通过GetTask接口获取任务状态

IMM同样也提供GetTask - 获取任务信息接口来查询任务状态。

通过轮询GetTask - 获取任务信息直到任务完成同样可以获取到任务状态,但这种方式的效率很低,在任务处理时间比较长的场景中,需要大量的GetTask - 获取任务信息调用,如果堆积的任务比较多,可能会触发全局限流,影响其他接口的调用。此外,轮询有时间间隔,而任务完成可能在间隔中的任意一个时间,平均需要延迟半个时间的时间间隔才能获取到任务状态。因此不建议在实际生产中使用该接口来获取任务状态。

说明

任务开始执行后,任务信息只保存7天,超过7天则无法再获取。

标签机制

请求参数中的Tags参数提供了一种标签机制,此参数可以在以下场景中使用:

  • 开发者可以设置自定义数据,这些数据会在MNS消息中返回。

  • Tags可以作为搜索任务的条件。

  • Tags可以作为变量在TargetURI中使用。