異步任務(wù)處理
IMM支持多種數(shù)據(jù)輸出,其中有些處理時(shí)間會(huì)比較長(zhǎng),無(wú)法在一次同步請(qǐng)求中返回。因此IMM提供了一類API來(lái)異步處理這種請(qǐng)求,這類API通常以CreateXXXTask
命名,同時(shí)提供了結(jié)果獲取的消息通知方式。
IMM提供的異步任務(wù)API適用于那些處理時(shí)間較長(zhǎng)、無(wú)法在一次同步請(qǐng)求中返回的場(chǎng)景。通過(guò)異步處理方式,可以避免阻塞主線程,提高系統(tǒng)性能,并在后臺(tái)完成數(shù)據(jù)處理、計(jì)算量大的操作,或者定時(shí)任務(wù),而不影響用戶體驗(yàn)。
任務(wù)處理流程
開(kāi)發(fā)者上傳源數(shù)據(jù)至阿里云對(duì)象存儲(chǔ)OSS。
開(kāi)發(fā)者調(diào)用IMM API接口
CreateXXXTask
發(fā)起異步任務(wù)處理請(qǐng)求。IMM從開(kāi)發(fā)者指定的OSS地址獲取源數(shù)據(jù)進(jìn)行數(shù)據(jù)處理。
IMM將數(shù)據(jù)處理結(jié)果寫回開(kāi)發(fā)者指定的OSS地址。
IMM處理完數(shù)據(jù)后,將任務(wù)狀態(tài)發(fā)送至開(kāi)發(fā)者指定的MNS或RocketMQ。
MNS或RocketMQ將消息推送至開(kāi)發(fā)者的服務(wù)中。
任務(wù)輸入輸出
輸入數(shù)據(jù)參數(shù)一般以Source命名,包括如下參數(shù):
SourceURI:數(shù)據(jù)源地址,目前僅支持OSS URI。
Sources:多個(gè)輸入URI地址數(shù)組。
Source:多個(gè)輸入URI對(duì)象。
輸出數(shù)據(jù)參數(shù)一般以Target命名,包括如下參數(shù):
TargetURI:目標(biāo)地址,該地址支持模板語(yǔ)法。
TargetURIPrefix:目標(biāo)地址前綴。
Target:多個(gè)輸出URI對(duì)象。
輸入數(shù)據(jù)和輸出數(shù)據(jù)需要和IMM在同一個(gè)地域。
OSS URI
OSS URI是用來(lái)定位唯一的一個(gè)OSS資源,其格式為oss://<bucket>/<object>
,例如oss://test-bucket/test-object/test.docx
。
Bucket為和當(dāng)前項(xiàng)目處于同一地域的OSS Bucket名稱,Object為包含文件擴(kuò)展名的文件完整路徑。
常見(jiàn)的錯(cuò)誤輸入格式:
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提供一些占位符,使用時(shí)用實(shí)際的值去替換占位符,從而動(dòng)態(tài)生成實(shí)際的URI地址。例如oss://{bucket}/{tags.custom}/{dirname}/{barename}.{autoext}
。
關(guān)于TargetURI的更多信息,請(qǐng)參見(jiàn)TargetURI 模板。
授權(quán)機(jī)制
異步任務(wù)處理的輸入數(shù)據(jù)和輸出數(shù)據(jù)均為開(kāi)發(fā)者提供的地址,需要授權(quán)IMM服務(wù)輸入數(shù)據(jù)的讀權(quán)限和輸出數(shù)據(jù)的寫權(quán)限。這些權(quán)限來(lái)自于ProjectName參數(shù),在CreateProject - 創(chuàng)建項(xiàng)目接口中,通過(guò)參數(shù)ServiceRole指定了一個(gè)授權(quán)給IMM的服務(wù)角色(默認(rèn)為AliyunIMMDefaultRole,開(kāi)通服務(wù)時(shí)自動(dòng)創(chuàng)建),IMM在異步任務(wù)處理中會(huì)通過(guò)扮演這個(gè)服務(wù)角色獲取和上傳數(shù)據(jù)。
獲取任務(wù)狀態(tài)
通過(guò)MNS或RocketMQ獲取任務(wù)狀態(tài)
如任務(wù)處理流程中所述,開(kāi)發(fā)者可以通過(guò)設(shè)置MNS或RocketMQ來(lái)接收IMM的任務(wù)處理狀態(tài),這也是IMM推薦的使用方式。MNS通知消息格式請(qǐng)參見(jiàn)異步通知消息格式。
MNS或RocketMQ需要和IMM在同一個(gè)地域。
通過(guò)Notification參數(shù)指定MNS或RocketMQ配置接收異步消息通知(推薦)
MNS:通過(guò)Notification參數(shù)中的MNS參數(shù)指定MNS通知地址和主題接收異步消息通知。
{ "Notification": { "MNS": { "Endpoint": "MNS消息通知地址", "TopicName": "MNS消息通知主題" } } }
RocketMQ:通過(guò)Notification參數(shù)中的RocketMQ參數(shù)指定RocketMQ通知地址、主題和實(shí)例ID接收異步消息通知。
{ "Notification": { "RocketMQ": { "Endpoint": "RocketMQ消息通知地址", "TopicName": "RocketMQ消息通知主題", "InstanceId": "RocketMQ消息通知實(shí)例Id" } } }
通過(guò)NotifyEndpoint和NotifyTopicName兩個(gè)參數(shù)指定MNS接收地址和主題接收異步消息通知
NotifyEndpoint:MNS消息通知地址,默認(rèn)為調(diào)用者的MNS地址。
NotifyTopicName:MNS消息通知主題,為空則不會(huì)發(fā)送消息通知。
通過(guò)GetTask接口獲取任務(wù)狀態(tài)
IMM同樣也提供GetTask - 獲取任務(wù)信息接口來(lái)查詢?nèi)蝿?wù)狀態(tài)。
通過(guò)輪詢GetTask - 獲取任務(wù)信息直到任務(wù)完成同樣可以獲取到任務(wù)狀態(tài),但這種方式的效率很低,在任務(wù)處理時(shí)間比較長(zhǎng)的場(chǎng)景中,需要大量的GetTask - 獲取任務(wù)信息調(diào)用,如果堆積的任務(wù)比較多,可能會(huì)觸發(fā)全局限流,影響其他接口的調(diào)用。此外,輪詢有時(shí)間間隔,而任務(wù)完成可能在間隔中的任意一個(gè)時(shí)間,平均需要延遲半個(gè)時(shí)間的時(shí)間間隔才能獲取到任務(wù)狀態(tài)。因此不建議在實(shí)際生產(chǎn)中使用該接口來(lái)獲取任務(wù)狀態(tài)。
任務(wù)開(kāi)始執(zhí)行后,任務(wù)信息只保存7天,超過(guò)7天則無(wú)法再獲取。
標(biāo)簽機(jī)制
請(qǐng)求參數(shù)中的Tags參數(shù)提供了一種標(biāo)簽機(jī)制,此參數(shù)可以在以下場(chǎng)景中使用:
開(kāi)發(fā)者可以設(shè)置自定義數(shù)據(jù),這些數(shù)據(jù)會(huì)在MNS消息中返回。
Tags可以作為搜索任務(wù)的條件。
Tags可以作為變量在TargetURI中使用。