1
+ import { SimpleApigwDetail } from './interface/index' ;
1
2
import { Capi } from '@tencent-sdk/capi' ;
2
- import { sleep } from '@ygkit/request' ;
3
3
import { ActionType } from '../scf/apis' ;
4
4
import { RegionType , ApiServiceType , CapiCredentials } from '../interface' ;
5
5
import { ApiError } from '../../utils/error' ;
@@ -105,7 +105,6 @@ export class TriggerManager {
105
105
const deleteList : ( TriggerDetail | null ) [ ] = deepClone ( oldList ) ;
106
106
const createList : ( NewTriggerInputs | null ) [ ] = deepClone ( events ) ;
107
107
const deployList : ( TriggerDetail | null ) [ ] = [ ] ;
108
- // const noKeyTypes = ['apigw'];
109
108
const updateList : ( NewTriggerInputs | null ) [ ] = [ ] ;
110
109
111
110
for ( let index = 0 ; index < events . length ; index ++ ) {
@@ -175,6 +174,7 @@ export class TriggerManager {
175
174
} ;
176
175
}
177
176
177
+ // 删除函数触发器
178
178
async removeTrigger ( {
179
179
trigger,
180
180
name,
@@ -209,7 +209,7 @@ export class TriggerManager {
209
209
}
210
210
211
211
// 部署函数触发器
212
- async deployTrigger ( {
212
+ async createTrigger ( {
213
213
name,
214
214
namespace = 'default' ,
215
215
events = [ ] ,
@@ -242,6 +242,7 @@ export class TriggerManager {
242
242
}
243
243
244
244
// 2. 创建新的触发器
245
+ const apigwServiceList : SimpleApigwDetail [ ] = [ ] ;
245
246
for ( let i = 0 ; i < deployList . length ; i ++ ) {
246
247
const trigger = deployList [ i ] ;
247
248
const { Type } = trigger ;
@@ -257,21 +258,27 @@ export class TriggerManager {
257
258
credentials : this . credentials ,
258
259
region : this . region ,
259
260
} ) ;
260
- // 针对触发器创建接口限频,由于后端服务问题,必须设置并发为 1
261
- // TODO: 兼容多个网关触发器并行部署时,服务发布会报错,待后端接口支持状态查询后再额外改造 apigw 模块
262
- this . runningTasks ++ ;
263
- if ( this . runningTasks > this . maxRunningTasks ) {
264
- await sleep ( 1000 ) ;
265
- }
261
+
266
262
const triggerOutput = await triggerInstance . create ( {
267
263
scf : this ,
268
264
region : this . region ,
269
265
inputs : {
270
266
namespace,
271
267
functionName : name ,
268
+ // 禁用自动发布
269
+ isAutoRelease : false ,
272
270
...trigger ,
273
271
} ,
274
272
} ) ;
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
+ }
275
282
this . runningTasks -- ;
276
283
277
284
deployList [ i ] = {
@@ -290,7 +297,7 @@ export class TriggerManager {
290
297
name,
291
298
triggers : deployList ,
292
299
} ;
293
- return outputs ;
300
+ return { outputs, apigwServiceList } ;
294
301
}
295
302
296
303
/**
@@ -396,6 +403,32 @@ export class TriggerManager {
396
403
} ) ;
397
404
}
398
405
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
+
399
432
/**
400
433
* 批量处理多函数关联的触发器配置
401
434
* @param triggers 触发器列表
@@ -404,28 +437,33 @@ export class TriggerManager {
404
437
async bulkCreateTriggers ( triggers : NewTriggerInputs [ ] = [ ] ) {
405
438
const scfList = await this . getScfsByTriggers ( triggers ) ;
406
439
407
- const createTasks : Promise < any > [ ] = [ ] ;
440
+ let apigwList : SimpleApigwDetail [ ] = [ ] ;
441
+ const res = [ ] ;
408
442
for ( let i = 0 ; i < scfList . length ; i ++ ) {
409
443
const curScf = scfList [ i ] ;
410
444
const triggersConfig = this . getScfTriggersConfig ( {
411
445
name : curScf . name ,
412
446
triggers,
413
447
} ) ;
414
448
const task = async ( ) => {
415
- const res = await this . deployTrigger ( {
449
+ const { outputs , apigwServiceList } = await this . createTrigger ( {
416
450
name : curScf . name ,
417
451
namespace : curScf . namespace ,
418
452
events : triggersConfig ,
419
453
} ) ;
420
- // this.runningTasks-- ;
421
- return res ;
454
+ apigwList = apigwList . concat ( apigwServiceList ) ;
455
+ return outputs ;
422
456
} ;
423
-
424
- createTasks . push ( task ( ) ) ;
457
+ const temp = await task ( ) ;
458
+ res . push ( temp ) ;
425
459
}
426
- const res = await Promise . all ( createTasks ) ;
427
460
428
- return res ;
461
+ await this . bulkReleaseApigw ( apigwList ) ;
462
+
463
+ return {
464
+ triggerList : res ,
465
+ apigwList,
466
+ } ;
429
467
}
430
468
431
469
/**
0 commit comments