1+ import { SimpleApigwDetail } from './interface/index' ;
12import { Capi } from '@tencent-sdk/capi' ;
2- import { sleep } from '@ygkit/request' ;
33import { ActionType } from '../scf/apis' ;
44import { RegionType , ApiServiceType , CapiCredentials } from '../interface' ;
55import { ApiError } from '../../utils/error' ;
@@ -105,7 +105,6 @@ export class TriggerManager {
105105 const deleteList : ( TriggerDetail | null ) [ ] = deepClone ( oldList ) ;
106106 const createList : ( NewTriggerInputs | null ) [ ] = deepClone ( events ) ;
107107 const deployList : ( TriggerDetail | null ) [ ] = [ ] ;
108- // const noKeyTypes = ['apigw'];
109108 const updateList : ( NewTriggerInputs | null ) [ ] = [ ] ;
110109
111110 for ( let index = 0 ; index < events . length ; index ++ ) {
@@ -175,6 +174,7 @@ export class TriggerManager {
175174 } ;
176175 }
177176
177+ // 删除函数触发器
178178 async removeTrigger ( {
179179 trigger,
180180 name,
@@ -209,7 +209,7 @@ export class TriggerManager {
209209 }
210210
211211 // 部署函数触发器
212- async deployTrigger ( {
212+ async createTrigger ( {
213213 name,
214214 namespace = 'default' ,
215215 events = [ ] ,
@@ -242,6 +242,7 @@ export class TriggerManager {
242242 }
243243
244244 // 2. 创建新的触发器
245+ const apigwServiceList : SimpleApigwDetail [ ] = [ ] ;
245246 for ( let i = 0 ; i < deployList . length ; i ++ ) {
246247 const trigger = deployList [ i ] ;
247248 const { Type } = trigger ;
@@ -257,21 +258,27 @@ export class TriggerManager {
257258 credentials : this . credentials ,
258259 region : this . region ,
259260 } ) ;
260- // 针对触发器创建接口限频,由于后端服务问题,必须设置并发为 1
261- // TODO: 兼容多个网关触发器并行部署时,服务发布会报错,待后端接口支持状态查询后再额外改造 apigw 模块
262- this . runningTasks ++ ;
263- if ( this . runningTasks > this . maxRunningTasks ) {
264- await sleep ( 1000 ) ;
265- }
261+
266262 const triggerOutput = await triggerInstance . create ( {
267263 scf : this ,
268264 region : this . region ,
269265 inputs : {
270266 namespace,
271267 functionName : name ,
268+ // 禁用自动发布
269+ isAutoRelease : false ,
272270 ...trigger ,
273271 } ,
274272 } ) ;
273+ // 筛选出 API 网关触发器,可以单独的进行发布
274+ if ( triggerOutput . serviceId ) {
275+ apigwServiceList . push ( {
276+ functionName : name ,
277+ serviceId : triggerOutput . serviceId ,
278+ serviceName : triggerOutput . serviceName ,
279+ environment : triggerOutput . environment ,
280+ } ) ;
281+ }
275282 this . runningTasks -- ;
276283
277284 deployList [ i ] = {
@@ -290,7 +297,7 @@ export class TriggerManager {
290297 name,
291298 triggers : deployList ,
292299 } ;
293- return outputs ;
300+ return { outputs, apigwServiceList } ;
294301 }
295302
296303 /**
@@ -396,6 +403,32 @@ export class TriggerManager {
396403 } ) ;
397404 }
398405
406+ /**
407+ * 批量发布 API 网关,防止重复发布同一个网关
408+ * @param list API 网关列表
409+ */
410+ async bulkReleaseApigw ( list : SimpleApigwDetail [ ] ) {
411+ // 筛选非重复的网关服务
412+ const uniqueList : SimpleApigwDetail [ ] = [ ] ;
413+ const map : { [ key : string ] : number } = { } ;
414+ list . forEach ( ( item ) => {
415+ if ( ! map [ item . serviceId ] ) {
416+ map [ item . serviceId ] = 1 ;
417+ uniqueList . push ( item ) ;
418+ }
419+ } ) ;
420+
421+ const releaseTask : Promise < any > [ ] = [ ] ;
422+ for ( let i = 0 ; i < uniqueList . length ; i ++ ) {
423+ const temp = uniqueList [ i ] ;
424+ const exist = await this . apigwClient . service . getById ( temp . serviceId ) ;
425+ if ( exist ) {
426+ releaseTask . push ( this . apigwClient . service . release ( temp ) ) ;
427+ }
428+ }
429+ await Promise . all ( releaseTask ) ;
430+ }
431+
399432 /**
400433 * 批量处理多函数关联的触发器配置
401434 * @param triggers 触发器列表
@@ -404,28 +437,33 @@ export class TriggerManager {
404437 async bulkCreateTriggers ( triggers : NewTriggerInputs [ ] = [ ] ) {
405438 const scfList = await this . getScfsByTriggers ( triggers ) ;
406439
407- const createTasks : Promise < any > [ ] = [ ] ;
440+ let apigwList : SimpleApigwDetail [ ] = [ ] ;
441+ const res = [ ] ;
408442 for ( let i = 0 ; i < scfList . length ; i ++ ) {
409443 const curScf = scfList [ i ] ;
410444 const triggersConfig = this . getScfTriggersConfig ( {
411445 name : curScf . name ,
412446 triggers,
413447 } ) ;
414448 const task = async ( ) => {
415- const res = await this . deployTrigger ( {
449+ const { outputs , apigwServiceList } = await this . createTrigger ( {
416450 name : curScf . name ,
417451 namespace : curScf . namespace ,
418452 events : triggersConfig ,
419453 } ) ;
420- // this.runningTasks-- ;
421- return res ;
454+ apigwList = apigwList . concat ( apigwServiceList ) ;
455+ return outputs ;
422456 } ;
423-
424- createTasks . push ( task ( ) ) ;
457+ const temp = await task ( ) ;
458+ res . push ( temp ) ;
425459 }
426- const res = await Promise . all ( createTasks ) ;
427460
428- return res ;
461+ await this . bulkReleaseApigw ( apigwList ) ;
462+
463+ return {
464+ triggerList : res ,
465+ apigwList,
466+ } ;
429467 }
430468
431469 /**
0 commit comments